全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1542
推到 Plurk!
推到 Facebook!

請教Thread下如何使用ADO對資料庫作資料的更新動作?

尚未結案
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-20 11:57:52 IP:61.66.xxx.xxx 未訂閱
想請問一下,我目前在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-20 17:06:19 IP:218.163.xxx.xxx 未訂閱
shihchin 你好 : 紅色部分應該改成 ADOQuery.ExecSQL;
shihchin
一般會員


發表:10
回覆:12
積分:4
註冊:2002-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-20 20:05:09 IP:61.66.xxx.xxx 未訂閱
其實我也試出只要將OPEN改成ExecSQL就可以了,只是我還想知道為何OPEN不可以,不過還是謝謝你的回答. 發表人 - shihchin 於 2003/10/20 20:06:32
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-20 20:15:43 IP:218.32.xxx.xxx 未訂閱
節錄一段 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-21 09:53:39 IP:61.66.xxx.xxx 未訂閱
謝謝版主的回答.
系統時間:2024-05-19 12:44:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!