1. 程式人生 > >Delphi使用ADO連接網絡數據庫,斷網後重連問題

Delphi使用ADO連接網絡數據庫,斷網後重連問題

無法 create exit eat bject sender class exce cep

原始文章: https://blog.csdn.net/blog_jihq/article/details/11737699#

使用TADOConnection對象連接網絡數據庫(以MySQL為例),當本地網絡斷開時,連接對象的Connected屬性不會發生變化,一直是True。

即使將連接對象的KeepConnection屬性設置為false,若網絡斷開,在不嘗試連接數據庫的情況下,Connected屬性也是true;在嘗試連接數據庫失敗之後,Connected屬性才變為false。

var
  ADOCon: TADOConnection;
begin
  //to do 創建ADOCon對象,並為ADOCon賦值連接字符串,代碼省略
ADOCon.KeepConnection := false; //此時網絡連接正常 ADOCon.Open; //或者ADOCon.Connected := true; ADOCon.Connected; //該屬性值為true //斷開網絡連接 ADOCon.Connected; //該屬性值為true ADOCon.Open; //此時連接出現異常 ADOCon.Connected; //該屬性值為false end;

因此在代碼中無法使用Connected屬性來判斷ADO對象是否連接正常;而且如果使用此連接對象在查詢數據庫異常後,直接關閉再打開連接會沒有效果,無法連接成功,必須重新打開運行程序,或者重新創建連接對象。

針對這種情況,網絡上通用的解決辦法就是增加一個timer定時器,創建新的測試連接對象定時去連接數據庫,若連接失敗則關閉連接對象並重連,以實現斷網後的自動重新連接,在斷網後操作數據庫時不出現卡頓現象。

procedure TForm1.tmr1Timer(Sender: TObject);
  function TestConnected: Boolean;
  var
    aCon: TADOConnection;
  begin
    Result := False;
    aCon := TADOConnection.Create(nil); //創建臨時對象
    try
aCon.ConnectionString := const_DBCON_MYSQL; //連接字符串 try aCon.Connected := True; Result := True; except Exit; end; finally aCon.Free; end; end; begin if not TestConnected then //使用臨時對象判斷數據庫連接狀況 begin FADOCon.Close; //根據臨時對象連接狀況操作連接對象,若無法連接則關閉連接對象,若連接正常則打開連接對象 end else begin if FADOCon.Connected then FADOCon.Connected := True; end; end;

不過,如果斷網或者數據庫掛掉的情況非常少,而且對斷網後查詢數據出現卡頓現象沒有特殊要求,那麽可以在每次操作完數據庫後關閉連接對象,這樣即便是斷網狀態下,連接也是關閉的,查詢數據庫出現異常也不會影響網絡恢復後的數據庫操作。

procedure TForm1.btn3Click(Sender: TObject);
begin
  try
    FADOQuery.Close;
    FADOQuery.Connection := FADOCon;
    FADOQuery.SQL.Text := select * from fp_kpxx;
    FADOQuery.Open; //連接對象關閉狀態下,查詢時會自動連接
    ShowInfoDlg(IntToStr(FADOQuery.RecordCount));
    FADOCon.Close;
    //此時斷開網絡
     FADOQuery.Open; //此時出現異常
     FADOCon.Close;
    //此時恢復網絡
     FADOQuery.Open; //此時查詢正常
     FADOCon.Close;
  except
    ShowInfoDlg(查詢失敗);
  end;
end;

連接對象Close之後若網絡未斷開,然後使用TADOQuery對象操作數據庫時不會重新連接數據庫,沒有時間延遲;若連接對象Close之後網絡斷開,再使用查詢對象操作數據庫時會重新連接數據庫,有一定的數據延遲。所以使用這種解決辦法雖然可以在斷網後重連,但斷網後的第一次數據庫操作會有卡頓現象。

Delphi使用ADO連接網絡數據庫,斷網後重連問題