使用Adoconnection连接SqlServer数据库,数据库重启,网络异常(比如拔了网线又插上),运行着的程序如果执行数据库操作则会出现 Connection failure错误,我不想关了程序再重新运行,也不想在每执行一个数据库操作都用Try ... Except ...End 在Except部分执行Adoconnection.Close;Adoconnection.Open;这两句来解决,因为这是事后补救,而且这种办法可以在Adoconnection的OnExecuteComplete事件中做控制,还不用在每个数据库操作去补加,比如
if SameText(Error.Description,'Connection Failure') then
   begin
    ADOConnection1.Close;
    ADOConnection1.Open;
   end;
我想要事前解决掉,意思就是我程序运行着,如果发生(数据库重启,拔了网线又插上)类似情况,程序能一次都不报Connection failure错误,象没发生过一样。Adoconnetion的OnInfoMessage是捕捉不到这个错误的。各位大仙帮帮忙啊

解决方案 »

  1.   

    1、两层且采取长连接方式是有这种问题的,如果是三层就没有
    2、除了每处用异常处理外,可以尝试在Application.OnException,即全局异常中统一处理
      

  2.   


    跟长连接不长连接没有关系吧?因为Ado一旦连过一次后它就自己保持连接状态,除非每次执行完数据库操作就将连接Close,这样效率损失太大吧?
    三层中也是有这种问题的吧?我就是在三层中碰到这种问题了,请问三层中如何设置能避免这种问题?
      

  3.   

    如何判断数据库链接是否正常?AdoConnection只要成功连接后,它自动一直保持Connected为true,除非执行Close操作,数据库重启,网络异常(比如拔了网线又插上)情况发生时Connected也不会有变化,但实际上上述情况发生后,AdoConnection的连接已经是虚连接了,所以才有Connection failure错误。就是不知道如何判断数据库链接是否正常?难道专门写个查询来验证连接是否有效?这是笨办法,有没有更好的主意?
      

  4.   

    ADO没有判断链接是否正常的接口,一般采用的是从执行一条SQL语句,看是否正常返回,我们用的SQL语句是:
    SELECT 1 AS FieldName FROM TableName WHERE 1=2
      

  5.   

    重啟時也有傳值啊,我現在的程序裡就是這樣做的:
    當沒有網絡時,數據暫存在本地;待網絡暢通時直接傳到SQL上;當你重啟後,給你一個caption提示或顯示出來提示的信息即可;這樣數據才會即時和實時,根本不會出現你所說的這樣問題這是程序技術方法問題,根本不會影響程序或數據庫的效率...
      

  6.   

    重啟時也有傳值啊,我現在的程序裡就是這樣做的:
    當沒有網絡時,數據暫存在本地;待網絡暢通時直接傳到SQL上;當你重啟後,給你一個caption提示或顯示出來提示的信息即可;這樣數據才會即時和實時,根本不會出現你所說的這樣問題這是程序技術方法問題,根本不會影響程序或數據庫的效率...