初衷是想在執行SQL查詢的程序中,讓用戶可以點擊“終止”而放棄查詢。在網上搜了一些代碼,自己修改一下做測驗,結果不行。以下是我的測驗代碼:
TForm1上三個按鈕:
Button11,用于建立新執行緒,并指向執行SQL查詢的函式;
Button22,用于啟動SQL——點這就出現例外錯誤;
Button33,用于終止查詢——還沒試到這一步。
//---------執行緒入口函式
function MyThreadFun(p: Pointer): Integer; stdcall;
var
quy:TADOQuery;
begin
with TADOQuery.Create(application) do
begin
Connection:=ADOConnection1;//ADOConnection1是進入系統時的公用連接.
close;
SQL.Clear;
SQL.add('exec PRC_TEST');
//服務器端程序 PRC_TEST 的主要內容就一句:WAITFOR DELAY '02:00'
Open;
end;
Result := 0;
end;
//---------建立并掛起執行緒
procedure TForm1.Button11Click(Sender: TObject);
var ID: DWORD;
begin
hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
//Button1.Enabled := False;
end;
//---------喚醒并繼續執行緒,啟動查詢
procedure TForm1.Button22Click(Sender: TObject);
begin
ResumeThread(hThread);
end;
//---------取消SQL查詢
procedure TForm1.Button33Click(Sender: TObject);
begin
ADOConnection1.Cancel;;
end;
煩請各位給予指導,謝謝!
uj5u.com熱心網友回復:
CoInitialize(nil);try
......
finally
CoUninitialize;
end;
在執行緒中用ADO連接需要加入上面的陳述句。
uj5u.com熱心網友回復:
看代碼覺得能執行一次,然后就無法執行了uj5u.com熱心網友回復:
我也這么覺得,執行存盤程序沒法停止吧...
uj5u.com熱心網友回復:
ADOConnection1.Cancel;
這個,就是用來終止程序執行的,應該可以的。
uj5u.com熱心網友回復:
謝謝你的回答。
按你說的,我這樣,錯誤依舊:
function MyThreadFun(p: Pointer): Integer; stdcall;
begin
try
Coinitialize(nil);
with TADOQuery.Create(application) do
begin
Connection:=ADOConnection1;
close;
SQL.Clear;
SQL.add('exec PRC0300');
Open;
end;
finally
CoUninitialize;
end;
end;
uj5u.com熱心網友回復:
你這樣用可能有問題,你要執行一個儲存程序,下面又用OPEN,可能出錯。建議你先將SQL陳述句改成:SQL.Add('select * from t1');//找一個記錄數少的表,看是否出錯。
uj5u.com熱心網友回復:
記錄少的,很快就執行完了,我就沒有機會去終止它。所以就用了 一修正直在等待的程序。
uj5u.com熱心網友回復:
有沒哪朋友做過這種東西呢...uj5u.com熱心網友回復:
ADOConnection1.Cancel; 只是說這個查詢結果我不要了,查詢還是會在服務器上進行吧你用CreateThreadchuan創建執行緒必須把全域變數IsMultiThread設定為true,或者用BeginThread來創建執行緒,
當然最好是繼承TThread來做。
uj5u.com熱心網友回復:
你好,謝謝你的回答。
能否幫忙寫一段代碼?萬非感謝!
uj5u.com熱心網友回復:
你自己先別用執行緒測驗你這個存盤程序能不能正確回傳結果,如果有例外,給出例外提示是什么轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/133615.html
標籤:數據庫相關
