數據庫連接失敗時,如何捕捉錯誤,避免彈出錯誤提示,以便下次自動重新連接
主要是要避免人工介入。一旦彈出錯誤提示,如果沒有人工介入把它關掉,則程序會一直停在那里,無法自動重新連接。
在連接的時候雖然加入了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
;
