delphi应用程序我一般用ADO进行连接,这方面涉及到好几个现象:
一、正常连接,程序启动后连接数据库,若连接条件都正常,软件很快就能连接成功。这个就不用说了;
二、连接失败。这方面包括数据库服务器不正常、应用程序连接参数错误等等,在连接过程中,会造成界面假死的现象,而且持续时间较长(我设置超时时间好像不起作用,如AdoConn.ConnectionTimeout := 10;)。最后弹出对话框说连接错误,并返回错误信息;这是让我很头疼的问题;
三、和数据库连接过程中,若物理连接断开,应用程序不会检测到,须手工处理。而软件向数据库提交select、Insert、Update、Delete等操作后,应用程序也会出现上面所述的那种情况。对连接检测的处理,我目前使用的方法如下代码所示:
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;判断有“连接失败”的返回错误信息后,就在程序中将连接关闭。若再次启动,如果启动失败的话,还是像第二个问题一样。
鉴于上述三种现象,我想和大家探讨有没有好点的方法使应用程序在连接数据库失败的情况下界面没有假死现象。我考虑过用线程,可是不知道怎么去做。

解决方案 »

  1.   

    沒有什麼好辦法,對於MSSQL我現在POS部分經常是不斷的發送 GETDATE() 的SQL,KEEPCONNECTION := TRUE,斷開後立即知道再重連。
      

  2.   


    有一點你沒有注意到。 這種方法是模擬心跳,也就是說在登錄的時候你要保證確定當前的狀態,如果已經連接上了有連接上的處理,沒有連接上看你的需求了。連接上的話,注意 keepConnection  的設置,TRUE和FALSE下效果有差異,然後定期幾種GETDATE()下,因為有KEEPCONNECTION這個前提,
    所以如果網絡斷開,響應是很快的。 但如果斷開了再操作的話,這個響應會很慢,這是沒有辦法的。
      

  3.   

    有Appevent事件捕捉Sql连接异常!
      

  4.   

    我现在通过ExecuteComplete事件中进行处理了,参考我在上面帖出的代码,但是前提是有数据的操作(如查询、插入、更新和删除),这些操作在执行中如果提交失败,会返回错误提示。提示信息中包括“连接失败”的信息,我就判断断开了。
      

  5.   


    我在软件中 keepConnection属性设置为TRUE。我的处理方法和你类似,也有定时和数据库服务器时间同步功能。见如下代码
    function TdmDBConn.GetDBServerTime: TDateTime;
    var
      strErr : string;
    begin
      Result := 2.0;
      try
        with adoqSysTime do
        begin
          Active:=False;
          Sql.Clear;
          Sql.Add('select rq=getdate()');
          Active:=True;
          Result:=Fields[0].AsDateTime;
          Active:=False;
        end;
      Except
        on e:exception do
        Begin
          strErr := 'TdmDBConn.GetDBServerTime执行异常:'+ 'select rq=getdate()'+';'+e.Message;
          LogCreate_DBErrDetail(strErr);
        End;
      end;
    end;如果是正常的,不会有任何影响。断开有两种情况:
    1、因其他因素,数据库的物理连接断开了,如网络断开、服务器异常等等,软件检测后关闭数据源连接。在软件重新打开这个连接前,“现场”恢复了,软件只需要重新连接即可。就是说肯定连接上,这种现象正是需要的结果;
    2、同第一种情况差不多,不同的是在软件重新连接前,“现场”还没有恢复,就是说单凭软件自动连接是不可能的,需要手工恢复正常环境。如恢复数据库服务器正常运行、网络正常等等。这种情况下软件会出现短暂的“死机”现象。我很关注这点。