procedure TCartThread.GetOneUnitInList;
var
  IniNum,i:integer;
  StackerNum:String;
begin
with MainFrame.ADOQuery3 do
  begin
    Close;
    SQL.Clear;
    SQL.Add(Pchar('select top 1 * from 入库给监控机表 where 发送标记=0 and 巷道车号>4 and 小车标志=1'));
    for i := 5 to 9 do
      if bplcinuse[i]=False then
        SQL.Add(Pchar(' and 巷道车号<>'+inttostr(i)));
    Open;
  end;
  if MainFrame.ADOQuery3.RecordCount=0 then exit;
  MainFrame.ADOQuery3.First;                                             //取得第一条当前工作的巷道车号的货单
  StackerNum := MainFrame.ADOQuery3.FieldValues['巷道车号'];
  IniNum := StrtoInt(StackerNum);  if IniNum=9 then        //旋转货架的货单,要将现有旋转货架的货单的处理标志都置位
  begin
    with MainFrame.ADOQuery3 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from 入库给监控机表 where 巷道车号=9 and 发送标记=0 and 小车标志=1');
      Open;
      First;
      repeat
        Edit;                                          //置位处理标志
        FieldValues['发送标记'] := True;
        Post;
        Next;
      until Eof;
    end;
  end;
  if IniNum<>9 then                     //其他下位机的货单,只将当前条的处理标志置位
  begin
    MainFrame.ADOQuery3.Edit;                                            //置位处理标志
    MainFrame.ADOQuery3.FieldValues['发送标记'] := True;
    MainFrame.ADOQuery3.Post;
  end;
end;
先用一个ADOCONNECTION连接服务器,然后将ADOQUERY3挂在上面,用来查询.

解决方案 »

  1.   

    里面的几个标志字段都是BOOL型的.SQL语句以前也没有PCHAR,有时候会出错.现在加了,可以运行,但是还是有时候出错.请问是怎么搞的.还有,MainFrame.ADOQuery3.FieldValues['发送标记'] := True好呢,还是用
    MainFrame.ADOQuery3.Fieldbyname['发送标记'].asboolean := True好?我看帮助上说是MainFrame.ADOQuery3.FieldValues['发送标记'] := True好点.
      

  2.   

    可能是线程争用资源问题,试试Synchronize()
      

  3.   

    每个程序肯定有一个主线程,你创建了一个线程就是两个线程,这就需要用Synchronize进行同步,说白了也就是加锁和解锁
      

  4.   

    MainFrame.ADOQuery3.Fieldbyname['发送标记'].asboolean := True这种写法比较好
      

  5.   

    SQL.Add(Pchar('select top 1 * from 入库给监控机表 where 发送标记=0 and 巷道车号>4 and 小车标志=1'));把PChar去掉,因为这里只需要String而不需要指针型的字符串,同理后面的PChar也要全去掉