三层结构中,在数据传送中网络断开,客户端程序就会死掉,怎样解决?(200分)

  • 主题发起人 主题发起人 wjs
  • 开始时间 开始时间
1.请问如何把记录集数据转换为XML
2.那服务器端又如何读取xml中记录集数据
3.是否能给我一些相关事例(我目前有一项目要用此方法,但我无从下手)?
不胜感激,谢谢
 
我的语句形如:(实际比较长)
while not ClientDM.table1.Eofdo
begin
Application.ProcessMessages;
ClientDM.ClientDataSetClient.CommandText :=
'INSERT INTO detailqq ' +
'( DEPARTID, DAYS, TIMES, MILLITM, MARKER ) ' +
'VALUES ( ' +
'''' + MyClass.GetCode + '''' + ',' +
'''' + ClientDM.table1.FieldByName('Date').AsString + ''', ' +
'''' + ClientDM.table1.FieldByName('Time').AsString + ''',
...);
try
ClientDM.ClientDataSetClient.Execute;
// insert a record
except
...
break;
end;
ClientDM.table1.Next;

end;
//while
 
如果你的网络情况这样的话,应该好好检查物理连接,或驱动和协议是否正常。
否则可以在WHILE语句之前检查网络状况就行了。
 
thanks. 我在 while 前加有网络的检测。
 
是不是CONNETION1那儿的超时连接设置得过长?
 
还是代码有问题,在循环中没有检测和处理的代码
 
CONNETION 哪个属性设置超时限制呀? 我怎么没找见?
 
我在跟踪时发现,网络断开后,Connection1的Connected 属性仍为真。
无法捕获错误。
 
谢谢 wjs
但我是初次介入这方面,不知你是否愿意发给我一个demo
我的Email:kivenlu@sina,com
 
kiven_lu,
delphi 的demo 目录下有例子呀!
 
我也曾遇到同样问题,但是问题还没有根本解决。
我的处理方法,把数据提交放在一个线程中处理,
但是如果在提交数据时发生网络中断,该线程就会死掉,无法Terminate,
此时强行杀死该线程,由用户选择保存为本地还是继续提交,如果继续提交,判断网络状况后重新建立线程。
这样也是没有办法的办法了。
所以,我也希望那位大侠能解决这个难题。
 
谢谢 yjy2002 大虾!
我试一试!
 
加到线程后,我的程序只运行一次,网没断开程序就死掉了。
yjy2002:
能否贴出有关代码,学习一下?
 
UPUPUPUPOUPOU不断。。。。
 
一般地,当连接数据库发生问题的时候,数据库控件会自动尝试连接,时间大概在2分钟以上。
而这个试图用线程去终结的可能不行。我使用database控件的param中加入connect timeout之后,
时间是可以缩短一些的
 
cobi的论点同意,以前曾经看过一个贴子,也是相同的问题。最后讨论的结果是因为
数据库连接时如果突然断开那么他会自动尝试连接的。这不受你的代码的制约。所以
在客户端才会有死机的现象。至于解决方法,我忘了。好像也没有什么好的方法
 
我这里遇到一个类似的问题:在操纵Oracle数据库时,服务器端进程吊死,其它层的程序也
一路吊死(从COM+组件到客户端程序),COM+中该如何设置超时处理?如果只是一个简单的
Socket通信程序,我倒是有办法解决超时问题,但在COM/DCOM/COM+中,网络通令方面的东西
都被封装起来了,使得我无法使用一些基础的技术下手。
(我会另外开贴发分)
 
你如果用clientdata连接DataSetProvider1,要看DataSetProvider1.resolveToData这个属性
的设置,如果为False,那么在更新数据时DataSetProvider1会自动产生sql语言,这样的好处
就是更改数据块,但是如果出现错误,就不会出现任何错误提。如果设置为True,那么
就可以在DataSetProvider1.beforeApplyUpdate事件中写代码来控制,而且还可以在相关的
数据集的相应事件中写代码。这样如果出现任何错误,你可以在DataSetProvider1.onUpdateError
或者clientDataset.OnReconclieError事件中处理错误。至于你的情况,看看设置
DataSetProvider1.ResolveTodata的属性
 
后退
顶部