参考:http://www.itzhe.cn/article/20080125/63170.html
参考:http://hi.baidu.com/dragonmen2008/blog/item/8600c92e42accd321e308954.html
前几天有一客户出现一问题,说执行某某操作时提示“连接失败”,当时看了看情况跟踪了跟踪,真的很郁闷,adoquery的Connection.ConnectionString和sql.text都正确,并且公司执行不会出错,当时很郁闷,问了几个网友和同事,没人知道是怎么回事,那也不能让客户干等着呀,就跟踪吧,到最后也不知道是怎么回事,我就把adoquery的connection也就是adoconnection给关闭了,然后再打开一下,不出错了。
最后我考虑了一下,是不是上一次的数据没有处理完?就开始执行下一句了,有可能是吧,哈哈,不管咋说问题解决了。
参考:http://bbs.2ccc.com/topic.asp?topicid=38838
我用Delphi 6做了一个电子产品库存查询系统,数据库采用SQL Server 2000。现在用户反映有以下问题:
几个用户同时连接到服务器进行查询时,若过了一段时间(用户描述地不是很具体,大概是15分钟;在这段时间内,用户没有使用系统)再来使用系统,就会弹出“连接失败”的对话框。但此时再重新运行应用程序的另一个实例时,却没有问题,能正常查询。但过了一段时间再来使用系统又有问题。
procedure TDMAdoCon.con1ExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
begin
// 在網絡斷開的時候,客戶端查詢無法完成,返回"連線失敗",但當網絡恢復後再查詢還是"連線失敗"
// 可能adoconnection還使用上次連接的HANDLE,在連線失敗後重連即可
// adoconnection連接失敗返回的錯誤代碼-2147467259(80004005)
if assigned(error) then
if error.Number + -2147467259 = 0 then
connection.Close;
end;
参考:http://topic.csdn.net/u/20090325/17/49d51ab2-567a-4c0a-aa2c-2ad4e13a086c.html
delphi应用程序我一般用ADO进行连接,这方面涉及到好几个现象:
一、正常连接,程序启动后连接数据库,若连接条件都正常,软件很快就能连接成功。这个就不用说了;
二、连接失败。这方面包括数据库服务器不正常、应用程序连接参数错误等等,在连接过程中,会造成界面假死的现象,而且持续时间较长(我设置超时时间好像不起作用,如AdoConn.ConnectionTimeout := 10;)。最后弹出对话框说连接错误,并返回错误信息;这是让我很头疼的问题;
三、和数据库连接过程中,若物理连接断开,应用程序不会检测到,须手工处理。而软件向数据库提交select、Insert、Update、Delete等操作后,应用程序也会出现上面所述的那种情况。对连接检测的处理,我目前使用的方法如下代码所示:
Delphi(Pascal) code
procedure TdmDBConn.AdoConnExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
var
ErrNo : integer;
ErrDetail,ConnStr : WideString;
begin
if Error <> Nil then
Begin
ErrNo := Error.Number;
ErrDetail := Error.Description;
ConnStr := AdoConn.ConnectionString;
if Pos('连接失败',ErrDetail) > 0 then
Begin
if GAgentSysParam.ServerConnDB = 1 then
Begin
AdoConn.Close ;
End;
End;
End;
end;
判断有“连接失败”的返回错误信息后,就在程序中将连接关闭。若再次启动,如果启动失败的话,还是像第二个问题一样。
参考:http://topic.csdn.net/u/20090610/20/05233773-0bee-43c2-9dad-d17c9098cb43.html
在 KEEPCONNECTION=TRUE 的情况下,Connected属性永远为TRUE,即使网络已断开1年也是一样,所以通过设置TIMEOUT属性的方法不可用
参考:http://topic.csdn.net/t/20050422/18/3959324.html
try
一系列数据库操作
except on e:exception do
begin
1,ADOConnection1.Close;//这句非常重要,为下次连接释放资源。
2,记错误日志,如:writelog(e.message);
3,输出错误信息。。或者继续把这个异常向外层再抛出。raise;
end;
end;