數據庫連接失敗時,如何捕捉錯誤,避免彈出錯誤提示,以便下次自動重新連接


數據庫連接失敗時,如何捕捉錯誤,避免彈出錯誤提示,以便下次自動重新連接

主要是要避免人工介入。一旦彈出錯誤提示,如果沒有人工介入把它關掉,則程序會一直停在那里,無法自動重新連接。 
在連接的時候雖然加入了try....except保護,但還是無法避免在操作數據庫中數據時網絡連接突然斷掉或數據庫服務被關閉時彈出錯誤提示。 
曾經看到過可以在Application的某個事件中進行處理,但現在檢索不到

 

 

LZ說的那個事件是Applicataion.OnException,程序所有錯誤都會觸發這個事件

一個系統和數據庫連接的代碼可能有很多,又存在於不同的單元
每個open/excesql/...都加上try...except顯然不好實現,自己想辦法寫一個方法能通用的,然后供其它的單元調用

然后只在此方法內try...except就行了,連接失敗就鎖定程序再啟動檢測,多長時間或者多少次也連接不成功就退出程序,不過要區別是SQL語句語法錯誤還是ADO連接失敗,可以再嵌套一個try...except,如:

   try
   adoquery1 . open;
   except
     on  e:exception  do
     begin
       showmessage( '執行語句失敗,原因:' +e . message);
       try
         adoconnection1 . Connected:= false ;
         adoconnection1 . Connected:= true ;
       except
         on  e:exception  do
         begin
           {showmessage('連接數據庫失敗,原因:'+:e.message);
           這里調用另一方法啟動檢測(方法內是循環/延時}
         end ;
       end ;
     end ;
   end ;
 
 
這種情況應該在有數據庫操作的函數中處理,通過try except  end來撲捉數據庫連接錯誤消息,如果數據庫操作有錯誤或者連接失敗,
則rusult:=e.message ,如果沒有錯誤則result:=‘’;通過返回值可以處理是否需要重新連接數據庫,給你一段代碼看看:
 
{初始化時Timer的enable為false}
procedure  TDataModule1 . TimerTimer(Sender:TObject);
begin
   OpenLink;   {用戶重新連接數據庫}
end ;
 
procedure  TDataModule1 . OpenLink;
var
   ini:Tinifile;
   s,DSource,dbname,uname,pword: string ;
begin
    Timer . Enabled:= false ;
    ledform . label1 . Caption:= '正在重新連接數據庫......' ;
 
    ini:=Tinifile . Create(extractfilepath(paramstr( 0 ))+ 'DataConnect.ini' );
    try
      DSource:=ini . ReadString( 'DataBase' , 'Server' , '192.168.0.1' );
      dbname:=ini . ReadString( 'DataBase' , 'DB' , 'Message' );
      uname:=ini . ReadString( 'DataBase' , 'UName' , 'user' );
      pword:=ini . ReadString( 'DataBase' , 'PW' , '12345' );
    finally
      ini . Free;
    end ;
    s:= 'Provider=SQLOLEDB.1;Persist Security Info=True;' ;
    s:=s+ 'Data Source=' +DSource;
    s:=s+ ';User ID=' +uname;
    s:=s+ ';Password=' +pword;
    s:=s+ ';Initial Catalog=' +dbname;
 
    try
      ADOConnection1 . Close;
      ADOConnection1 . ConnectionString:=s;
      ADOConnection1 . Open;
      ledform . label1 . Visible:= false ;
    except
      ledform . label1 . Caption:=‘連接數據庫失敗! 10 秒后重試!';
      Timer . Interval:= 10000 ;
      Timer . Enabled:= true ;
    end
end ;
 
{數據庫操作}
function  TDataModule1 . GetSD(Sid:  Integer ;ppn: Integer ): string ;
begin
   try
     with  WSD  do
     begin
       Close;
       SQL . Clear ;
       SQL . Add( 'select * from led_kongtiao_View' );
       SQL . Add( ' where ITEM_ID=' +inttostr(Sid));
       Open;
 
       if  RecordCount> 0  then
       begin
         if  (FieldByName( 'ITEM_VALUE' ).IsNull)  or  (FieldByName( 'ITEM_VALUE' ).AsString= '' then
            SD[ppn]:= '---'
         else
           SD[ppn]:=Dl(FieldByName( 'ITEM_VALUE' ).AsFloat)+ '%' ;
       end ;
     end ;
   except
     on  E: Exception  do
       Result := E . Message;
   end ;
end ;
 
{判斷數據庫操作是否成功}
function  Tledform . GetDB:  string ;
var
   str: string ;
begin
   Result:= '' ;
   str:=DataModule1 . GetSD( 1 , 1 );
   if  str<> ''  then
     {重新連接數據庫,具體可根據自己的實際情況來處理!}
     DataModule1 . timer . enable:= true ;
   else
     {正常連接數據庫,無操作}
end ;
 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM