我正在做一個專案,我需要考慮緊急情況。
主要問題是,如何檢查資料庫是否已連接(圓圈物件=紅色或綠色)?
BeforeConnect, AfterDisconnect, 他們沒有很好的答案。
內部型別:
創建連接:
procedure TForm1.Button1Click(Sender: TObject);
var
s : String;
begin
ADOConnectionSQL := TADOConnection.Create(nil);
ADOConnectionSQL.LoginPrompt := false;
with ADOSQL do
begin
s := 'Provider=SQLNCLI11.1;'
'Persist Security Info=False;'
'User ID=' Edit1.Text ';'
'Initial Catalog=' Edit2.Text ';'
'Data Source=' Edit3.Text ';'
'Initial File Name="";'
'Server SPN="";'
'password="' Edit4.Text '"';
ADOConnectionSQL.ConnectionString := s;
end;
ADOConnectionSQL.BeforeConnect := SQLConnected;
ADOConnectionSQL.AfterDisconnect := SQLDisconnected;
end;
嘗試連接:
procedure TForm1.Button2Click(Sender: TObject);
var
Thread : TThread;
begin
Thread := TThread.CreateAnonymousThread(
procedure
begin
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
try
ADOConnectionSQL.Connected := True;
ADOConnectionSQL.Open;
except
on E: Exception do
begin
ShowMessage('Exception message = ' E.Message);
end;
end;
ADOQuerySQL := TADOQuery.Create(nil);
end);
end);
Thread.OnTerminate := FinishConnected;
Thread.Start;
end;
綠色或紅色:
procedure TForm1.SQLConnected(Sender: TObject);
begin
Circle1.Fill.Color := $FF00FF00;
end;
procedure TForm1.SQLDisconnected(Sender: TObject);
begin
Circle1.Fill.Color := $FFFF0000;
end;
完成連接:
procedure TForm1.FinishConnected(Sender: TObject);
begin
if TThread(Sender).FatalException <> nil then
begin
// something went wrong
ShowMessage ('Failure to connection');
//Exit;
end;
end;
當 SQL Server 在線時,我想看到一個綠色圓圈。當與服務器的連接中斷時,圓圈應為紅色。
uj5u.com熱心網友回復:
您是在主 UI 執行緒的背景關系中創建和打開 ADO 連接,而不是在作業執行緒的背景關系中。所以你的作業執行緒基本上是沒用的。你可以用它TThread.ForceQueue()來代替獲得相同的效果。
ADO 在內部使用 COM 技術,因此無論如何您都不能真正跨執行緒邊界使用它。如果要在執行緒中使用 ADO,請為執行緒提供自己的 ADO Connection 和 Query 物件。在執行緒背景關系中執行所有 SQL 作業,并根據需要與主 UI 執行緒同步狀態更新。
此外,您需要在作業執行緒中初始化 COM 庫,然后才能使用 ADO。
嘗試更像這樣的事情:
procedure TForm1.Button1Click(Sender: TObject);
var
Thread : TThread;
ConnStr: string;
begin
ConnStr := 'Provider=SQLNCLI11.1;'
'Persist Security Info=False;'
'User ID=' Edit1.Text ';'
'Initial Catalog=' Edit2.Text ';'
'Data Source=' Edit3.Text ';'
'Initial File Name="";'
'Server SPN="";'
'password="' Edit4.Text '"';
Thread := TThread.CreateAnonymousThread(
procedure
var
ADOConnectionSQL: TADOConnection;
ADOQuerySQL: TADOQuery;
begin
CoInitialize(nil);
try
ADOConnectionSQL := TADOConnection.Create(nil);
try
ADOConnectionSQL.LoginPrompt := False;
ADOConnectionSQL.ConnectionString := ConnStr;
ADOConnectionSQL.Open;
TThread.Queue(nil,
procedure
begin
Circle1.Fill.Color := TAlphaColorRec.Green;
end
);
ADOQuerySQL := TADOQuery.Create(nil);
try
ADOQuerySQL.Connection := ADOConnectionSQL;
// use ADOQuerySQL as needed...
finally
ADOQuerySQL.Free;
end;
finally
ADOConnectionSQL.Free;
end;
finally
CoUninitialize;
end;
end);
Thread.OnTerminate := SQLFinished;
Thread.Start;
end;
procedure TForm1.SQLFinished(Sender: TObject);
begin
Circle1.Fill.Color := TAlphaColorRec.Red;
if TThread(Sender).FatalException <> nil then
begin
// something went wrong
ShowMessage('Failure! ' Exception(TThread(Sender).FatalException).Message);
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315593.html
上一篇:如何更改Linux的部署路徑?
