我往Splitter数据表里写入数据后启动线程,线程的作用主要是查询Splitter数据表中符合条件的记录数,如果达到一定的记录数,则将所有数据拼合起来。线程定义如下:  type
    TSplitterThread = class(TThread)
    private
      TMobileNo : String;
      TJunoId   : String;
      TAllColumn: Integer;
    protected
      procedure Execute; override;
    public
      constructor Create(MobileNo: String; JunoId: String; AllColumn: Integer); virtual;
  end;启动线程部分代码如下:
procedure A;
  ...
  // tblSplitter 为ADOTable 控件,对Splitter表进行操作
  with tblSplitter do begin
    Active := True;    Append;
    { 此处代码为插入数据 }
    Active := False;
  end;
  // 启动线程
  thrdSplitter := TSplitterThread.Create(strMobileNo, strJunoId, iAllColumn);
  Sleep(2000);
  ...
end;执行线程操作部分代码如下:
procedure B;
  // qrySplitter 为ADOQuery 控件,同样是对Splitter表进行操作
  // 就是以下操作经常提示错误
  with frmMain.qrySplitter do begin
    SQL.Clear;
    SQL.Add('SELECT DISTINCT * FROM [Splitter]');
    SQL.Add('WHERE ([MobileNo]=''' + TMobileNo + ''')');
    SQL.Add('AND ([JunoId]=''' + TJunoId + ''')');
    SQL.Add('AND ([AllColumn]=' + IntToStr(TAllColumn) + ')');
    SQL.Add('ORDER BY [NowColumn]');
    Active := True;
  end;
end;但是在procedure B中,错误信息为“Cannot perform this operation on a closed dataset”,如果去掉Sleep(2000)和将SQL语句的DISTINCT去掉,则不会出现这个错误,但是数据是乱的,就是拼合不正确,请问多线程的原理是什么?这段代码应该如何改?

解决方案 »

  1.   

    // 过程B 这样改试试
    procedure B;
    begin
        // qrySplitter 为ADOQuery 控件,同样是对Splitter表进行操作
        // 就是以下操作经常提示错误
        if frmMain.qrySplitter then frmMain.qrySplitter:=false;
        frmMain.qrySplitter.SQL.Clear;
        frmMain.qrySplitter.SQL.Add('SELECT DISTINCT * FROM [Splitter]');
        frmMain.qrySplitter.SQL.Add('WHERE ([MobileNo]=''' + TMobileNo + ''')');
        frmMain.qrySplitter.SQL.Add('AND ([JunoId]=''' + TJunoId + ''')');
        frmMain.qrySplitter.SQL.Add('AND ([AllColumn]=' + IntToStr(TAllColumn) + ')');
        frmMain.qrySplitter.SQL.Add('ORDER BY [NowColumn]');
        frmMain.qrySplitter.Active := True;
    end;
      

  2.   

    if frmMain.qrySplitter then frmMain.qrySplitter:=false;这样不对啊,qrySplitter不是Bool型的吧……