スレッド内でSQL文を発行するには?

解決


ゆうこ  2006-01-12 21:06:22  No: 19594

メインスレッドから生成された複数のサブスレッド内で
それぞれ動的にTADOConnectionクラス、TADOQueryクラスの
インスタンスを生成し、サブスレッド内でDBサーバの更新処理を
行おうと考えています。

スレッド内でTADOConnectionクラス及びTADOQueryクラスのインスタンスを
生成(Create)しようとすると
「プロジェクト〜は、例外クラスEOleSysError(メッセージ'CoInitializeは
  呼び出されていません。')を送出しました。」
の例外が発生します。
インスタンス生成部分を別関数にし、Synchronize()でくくってその関数を
コールすると例外は発生しません。
ただ、その場合でもその後TADOConnection、TADOQueryのインスタンスにアクセスする箇所
全てで上記エラーが発生するので、それら全てをSynchronize()でくくって
しまう必要があり、それだと、スレッド処理にした意味がないのかなと思っています。
(Synchronizeはメイン(画面)のコンテキストで処理を行う?から)

TADOConnectionクラス、TADOQueryクラスをスレッド内で動的に
インスタンスを生成し、動作させることはできないのでしょうか?

※同時に複数の処理を行う必要があり、同時に複数のSQL文発行を行いたい為、
  スレッドを複数たて、そのスレッド内でSQL文の発行をと考えています。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−
//*********************************
// スレッドクラス(TThreadそのままです)
//*********************************
  TThreadTest = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  Thread1: TThreadTest;

//******************************
// ボタン押下でスレッド起動する
//******************************
procedure TForm1.Button1Click(Sender: TObject);
begin
  Thread1 := TThreadTest.Create(True);
  Thread1.Resume;
end;

//********************
// スレッドメイン関数
//********************
procedure TThreadTest.Execute;
var
  ConDB: TADOConnection;
  SQLQuery: TADOQuery;
begin
  ConDB := TADOConnection.Create(nil);  // ←例外発生
  ConDB.Connected := True;              
  SQLQuery := TADOQuery.Create(nil); 
  SQLQuery.Connection := ConDB;

  while not Terminated do
  begin
    // SQLQuery処理
  end;

  SQLQuery.Free;
  ConDB.Free;
end;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−


えーと  2006-01-12 23:22:37  No: 19595

エラーメッセージにもあるとおりCoInitializeが必要です。
http://www.borland.co.jp/delphi/papers/com/com05.html


ゆうこ  2006-01-13 00:52:20  No: 19596

えーとさんありがとうございます。
紹介いただいたサイトがそのものずばりでした。
内容を全て把握できたわけではないのですが、
CoInitializeのコールで例外が発生しなくなりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加