使用ADSL运行三层数据库,更新数据的怪问题,快疯了,jishiping等老大来帮我。

zjsyw 2005-11-01 11:05:06
软件使用SOCKTCONNECTION的方式连接应用服务器,使用电话+猫拨号上网的窄带方式上传和下载业务数据都很正常,使用LAN的宽带也很正常,但使用ADSL下载很正常,上传数据时,传几个就会停止不动了。到电信查了,上传带宽给我512K的。这时上网往FTP上传数据也很正常,程序如下:
bool __fastcall TDM::thread_sybase_f3_xspc(TDateTime ser_time1,AnsiString sql_string2,int pd)
{
int num_djls;
bool resu=true;
mainform->suiStatusBar1->Panels->Items[4]->Text="正在查询已结帐'"+ser_time1.FormatString("yyyy-mm-dd")+"'销售数据(xspc)";
AnsiString sql_string;
sql_string="select * from XSPC where CONVERT(char(10),F_DBRQ,112)='";
sql_string+=ser_time1.FormatString("yyyymmdd")+"' and "+sql_string2;
sql_string+=" order by F_DBRQ";
DM->thread_get_djpc_sybase->Close(); //在本地数据库查询数据
DM->thread_get_djpc_sybase->SQL->Clear();
DM->thread_get_djpc_sybase->SQL->Add(sql_string);
DM->thread_get_djpc_sybase->Open();
DM->thread_get_djpc_sybase->First();
mainform->suiStatusBar1->Panels->Items[4]->Text="正在上传已结帐'"+ser_time1.FormatString("yyyy-mm-dd")+"'销售数据(xspc)";
while(!DM->thread_get_djpc_sybase->Eof)
{
if(DM->quit_thread) //接到中断线程的通知
break;
try
{
DM->found_xspc->Close(); //found_xspc是ClientDataSet,查询远程数据库表是否已经存在该条数据
DM->found_xspc->Params->ParamValues["f_xspch"]=DM->thread_get_djpc_sybase->FieldByName("f_xspch")->AsString.Trim();
DM->found_xspc->Params->ParamValues["f_bmbh"]=DM->thread_get_djpc_sybase->FieldByName("f_bmbh")->AsString.Trim();
DM->found_xspc->Open();
num_djls=DM->found_xspc->Fields->Fields[0]->AsInteger;
}
catch(Exception &e)
{save_error(ExtractFileDir(Application->ExeName)+"\\error.txt",e.Message);break; }
if(num_djls==0) //如果远程服务器上没有该xspc记录
{
try
{
DM->PostXsPC_sybase->Close(); //PostXsPc_sybase是ClientDataSet,将记录插入远程数据库的表
DM->PostXsPC_sybase->Params->ParamValues["f_xspch"]=DM->thread_get_djpc_sybase->FieldByName("f_xspch")->AsString.Trim();
DM->PostXsPC_sybase->Params->ParamValues["f_bmbh"]=DM->thread_get_djpc_sybase->FieldByName("f_bmbh")->AsString.Trim();
DM->PostXsPC_sybase->Params->ParamValues["f_dbrq"]=DM->thread_get_djpc_sybase->FieldByName("f_dbrq")->AsDateTime.FormatString("yyyy/mm/dd");
DM->PostXsPC_sybase->Execute();
mainform->suiStatusBar1->Panels->Items[3]->Text="aaaaaaa"; //ADSL没响应就停在这里
}
catch(Exception &e)
{save_error(ExtractFileDir(Application->ExeName)+"\\error.txt",e.Message);break; }
}
DM->thread_get_djpc_sybase->Next();
}

return resu;
}
...全文
365 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2005-11-08
  • 打赏
  • 举报
回复
没有遇到过这个问题。你说在执行到 mainform->suiStatusBar1->Panels->Items[3]->Text="aaaaaaa"; 时死掉了,那么先将这一行注释掉看看会怎样。
zjsyw 2005-11-07
  • 打赏
  • 举报
回复
jishiping(JSP 季世平),我在多线程里处理VCL对象是不严谨
zjsyw 2005-11-07
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) ( ) 信誉:207
我在主线程里试过一次,程序在该死的地方就死了,软件也死了,也没报错,很好玩吧,麻烦老大再帮我想想还有什么可能。
有个高手让我用sniffer逮个包看看,说是不是ADSL协议的问题,不过我想这和底层没关了吧,应该不是这问题。
zjsyw 2005-11-07
  • 打赏
  • 举报
回复
MEFULEU(没有作不到,只有想不到) ( ) 信誉:101 :
干吗不使用标准的SQL??

很明显DM->PostXsPC_sybase->Execute();执行出了问题;

替换成sql;

使用ExecSQL函数来试一下
为什么会出问题呢?因为窄带和光险款带下都很正常,特别是在光纤上运行了几个月了,处于费用的考虑才改ADSL的,没想到就出了这种问题,用户看我的眼神都怪怪的,我没辙了,很对不起他们,早知道不让他们改了,哎。另外改传SQL语句,难道不增加网络负担吗?如果上传几百条记录,用这种方法负担要比传参数大多了。
jishiping 2005-11-07
  • 打赏
  • 举报
回复
你是在子线程中执行上面的代码吗?如果是这样,那么就有问题。在子线程中,不要访问主线程中的带界面的VCL对象(比如你这儿的mainform->suiStatusBar1),否则就可能(不是一定)导致问题。线程中需要访问主线程的mainform->suiStatusBar1时,安全的用法是使用线程的Synchronize()函数。比如,在class中加一个变量AnsiString Status; 和一个函数void __fastcall UpdateStatus(); 需要更新主界面的状态文字时,先设定Status的值(给UpdateUpdate函数使用),然后线程中调用 Synchronize(UpdateStatus); 就可以了。

void __fastcall TDM::UpdateStatus()
{
mainform->suiStatusBar1->Panels->Items[4]->Text = Status;
}

bool __fastcall TDM::thread_sybase_f3_xspc(TDateTime ser_time1,AnsiString sql_string2,int pd)
{
int num_djls;
bool resu=true;
Status = "正在查询已结帐'"+ser_time1.FormatString("yyyy-mm-dd")+"'销售数据(xspc)";
Synchronize(UpdateStatus); //注意上面两行代码写法
//......其它代码,需要更新界面上的状态时,使用上面的同样的写法
}
MEFULEU 2005-11-07
  • 打赏
  • 举报
回复
干吗不使用标准的SQL??

很明显DM->PostXsPC_sybase->Execute();执行出了问题;

替换成sql;

使用ExecSQL函数来试一下


zjsyw 2005-11-06
  • 打赏
  • 举报
回复
我真的急得都不知道急了,都不知道现在星期几了
zjsyw 2005-11-06
  • 打赏
  • 举报
回复
wizardqi(男巫) ( ) 信誉:100 :
恩,可以试试.但窄带都很好呀,就是慢点,我56K的猫和36.6K的老猫也试过,正常的不能再正常了.
asdfg014 2005-11-04
  • 打赏
  • 举报
回复
有人帮我顶贴吗?
asdfg014 2005-11-04
  • 打赏
  • 举报
回复
学习
wizardqi 2005-11-04
  • 打赏
  • 举报
回复
特别是带宽窄的环境下很有效的。
wizardqi 2005-11-04
  • 打赏
  • 举报
回复
可能是上传速度太慢的缘故,写个Intercept将数据压缩一下处理。
zjsyw 2005-11-03
  • 打赏
  • 举报
回复
自己再顶一下,解决不了我吃不下饭,已经饿了几天了
sunj_study 2005-11-02
  • 打赏
  • 举报
回复
学习
zjsyw 2005-11-02
  • 打赏
  • 举报
回复
xili() :
跟sybase没关吧,数据库服务器上就一个数据库建了一些表。

sxzqlzx() :
数据库服务器和应用服务器在同一局域网里,用存储过程或直接用SQL语句,在异地的客户端都需要传参数给应用服务器,好让应用服务器去修改数据库服务器上的表呀。异地客户端又不直接和数据库连接。
yy2001 2005-11-02
  • 打赏
  • 举报
回复
gz
xili 2005-11-01
  • 打赏
  • 举报
回复
不应该吧,应该考虑远端 sybase 是否有问题.
sxzqlzx 2005-11-01
  • 打赏
  • 举报
回复
别用Params,用存储过程,传递参数,表的更新等放到服务器执行
wenchaohu213 2005-11-01
  • 打赏
  • 举报
回复
很关注


帮顶


狂接分!!!

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧