现在的位置: 首页 > 综合 > 正文

ADOquery 的问题,连接失败

2014年02月25日 ⁄ 综合 ⁄ 共 2346字 ⁄ 字号 评论关闭

参考: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; 

抱歉!评论已关闭.