unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;
type
   TTest=Class(TThread)
       protected
           Q_tmp:Tadoquery;
           Q_Str:string;
           procedure Execute;override;
           procedure QProcess;
       public
           constructor create(TQ:Tadoquery;TQ_Str:string);
    end;
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
 Constructor TTest.create(TQ:Tadoquery;TQ_Str:string);//&&&&新建
 begin
     Q_tmp:=TQ;
     Q_Str:=TQ_str;
     inherited create(false);
 end;                                               //&&&&&over
 procedure TTest.QProcess;    //**********查询开始
     begin
          with Q_tmp do
              begin
                 close;
                 sql.Clear;
                 sql.Add(Q_str);
                 try
                   open;
                   except
                     execsql;
                   end;
              end;
      end;                 //*************over
 procedure TTest.Execute;
 begin
      FreeonTerminate:=true;
      synchronize(QProcess);
  end;    
procedure TForm1.Button1Click(Sender: TObject);
begin
TTest.create(adoquery1,'select * from jobs');
end;

解决方案 »

  1.   

    对  TThread 还不是特别了解。。一般直接使用API不过。。
    try
      open;
    except
      execsql; // 哪里有这样的写法呢可以将此句屏蔽掉。。或做其他更有意义的事情
    end;
      

  2.   

    To beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>)
                  有时用open后,仍然无法打开查询到数据,需要用execsql才行,为什么了,怎么避  免.
      

  3.   

    TO beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>) 
            老师,太谦虚了,我查过你的底了,乃高手也。
      

  4.   

    procedure TTest.Execute;
     begin
          FreeonTerminate:=true;
          synchronize(QProcess); //QProcess 是什么东西
      end;  如果这个东西 可能会同时被多个线程访问 那么就需要加上 synch..进行同步处理 不然可以不用的。
    你是想创建单独的线程去执行不同的SQL语句吧。。
      

  5.   

    是啊,龙哥,创建单独的线程执行不同的SQL 语句安不安全,会出现什么问题
      

  6.   

    open有时会出错可能是线程间出现死锁
    这种数据库程序应该单独创建自己的tadoquery和tadoconnection
    执行数据库操作的代码段不需要同步但是如果执行过程中或者结束后要报告给主界面
    则往主界面写的代码需要同步