請教Thread下如何使用ADO對資料庫作資料的更新動作? |
尚未結案
|
shihchin
一般會員 發表:10 回覆:12 積分:4 註冊:2002-12-18 發送簡訊給我 |
想請問一下,我目前在Thread裡使用ADO對資料庫做更新的動作時,都會出現這個問題"Project UDPServer.exe raised exception class EOleException with message '目前提供者不支援從單一執行作業傳回多重資料錄集.',Process stoppted.Use Step or Run to continue.",底下是我的程式碼:
unit UDPServerMain; interface uses Windows, Messages, Graphics, Controls, Forms, Dialogs, IdWinsock2, stdctrls, SysUtils, Classes, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, IdComponent, IdUDPBase, IdUDPClient, IdStack, IdUDPServer, IdSocketHandle, Grids, DBGrids, DB, ADODB, DBTables; type TUDPMainForm = class(TForm) SourceGroupBox: TGroupBox; HostNameLabel: TLabel; HostAddressLabel: TLabel; HostName: TLabel; HostAddress: TLabel; UDPServer: TIdUDPServer; UDPAntiFreeze: TIdAntiFreeze; PortLabel: TLabel; Port: TLabel; BufferSizeLabel: TLabel; BufferSize: TLabel; UDPMemo: TMemo; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; procedure FormCreate(Sender: TObject); procedure UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private { Private declarations } public { Public declarations } end; type TServerThead = class(TThread) private DataStringStream: TStringStream; procedure DatabaseProcess; protected procedure Execute; override; public constructor Create(APData: TStream); end; var UDPMainForm: TUDPMainForm; implementation const HOSTNAMELENGTH = 80; {$R *.DFM} procedure TUDPMainForm.FormCreate(Sender: TObject); begin HostName.Caption := UDPServer.LocalName; HostAddress.Caption := GStack.LocalAddress; Port.Caption := IntToStr(UDPServer.DefaultPort); BufferSize.Caption := IntToStr(UDPServer.BufferSize); UDPServer.Active := True; end; procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin TServerThead.Create(AData); end; constructor TServerThead.Create(APData: TStream); begin DataStringStream := TStringStream.Create(''); DataStringStream.CopyFrom(APData, APData.Size); FreeOnTerminate := True; inherited Create(False); end; procedure TServerThead.Execute; begin Synchronize(DatabaseProcess); FreeOnTerminate := True; UDPMainForm.DBGrid1.Refresh ; end; procedure TServerThead.DatabaseProcess; var temp1,temp2:string; ADOConnection:TADOConnection; ADOQuery:TADOQuery; begin temp1:=Copy(DataStringStream.DataString,1,5); temp2:=Copy(DataStringStream.DataString,6,Length(DataStringStream.DataString)-5); UDPMainForm.UDPMemo.Lines.Add('Received "' DataStringStream.DataString ); ADOConnection:= TADOConnection.Create(nil); ADOConnection.ConnectionString:=UDPMainForm.ADOConnection1.ConnectionString; ADOConnection.LoginPrompt:=false; ADOConnection.Connected:=true; ADOQuery:= TADOQuery.Create(nil); ADOQuery.Connection:=ADOConnection; ADOQuery.Prepared:=true; ADOQuery.Close(); ADOQuery.SQL.Clear; ADOQuery.SQL.Add('select * from ab'); ADOQuery.SQL.Add('where b = ' #39 temp2 #39); ADOQuery.Open; if ADOQuery.RecordCount>0 then begin ADOQuery.Close; ADOQuery.SQL.Clear; ADOQuery.SQL.Add('update ab'); ADOQuery.SQL.Add('set a = ' #39 temp1 #39); ADOQuery.SQL.Add('where b = ' #39 temp2 #39); ADOQuery.Open; end else begin ADOQuery.Append; ADOQuery.FieldByName('a').AsString:=temp1; ADOQuery.FieldByName('b').AsString:=temp2; ADOQuery.Post; end; ADOQuery.Close(); ADOQuery.Free; ADOConnection.Connected:=false; ADOConnection.Free; DataStringStream.Free; end; end.目前只知道是在紅色那段程式跑完時就會有那個錯誤訊息出現,但是我不知該修正哪裡?還有請大大幫我看看我的THREAD的寫法是否有問題?先謝謝各位大大了. |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
shihchin
一般會員 發表:10 回覆:12 積分:4 註冊:2002-12-18 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
節錄一段 Delphi TADOQuery.ExecSQL Method , 參考看看 :
Description Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE). ExecSQL returns an integer value reflecting the number of rows affected by the executed SQL statement. Note: For SELECT statements, call Open instead of ExecSQL or set the Active property to true. To speed performance, an application should ordinarily prepare the query by setting the Prepared property to true before calling ExecSQL for the first time. |
shihchin
一般會員 發表:10 回覆:12 積分:4 註冊:2002-12-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |