Delphi使用ADO連接網絡數據庫,斷網後重連問題
阿新 • • 發佈:2018-08-05
無法 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連接網絡數據庫,斷網後重連問題