code=Delphi(Pascal)]type
TMythread=class(TThread)
private
    procedure execute;
    override;
    end;
procedure TMythread.execute;
   var  s1,loc1:string;
   a,b,p,y,z,count_up,count_down,k1,k2,j:integer;
   DateTimePicker1: TDateTimePicker;
   begin
     FreeOnterminate:=true;
     DateTimePicker1.date:=now;
     j:=1;
     datamodule5.ADOQuery2.Close;
     datamodule5.ADOQuery2.SQL.Clear;
     datamodule5.ADOquery2.SQL.Add('select * from zf_data');
     datamodule5.adoquery2.Open;
     k1:=datamodule5.ADOQuery2.RecordCount;
      while j<k1 do        //将涉及暂放的品番挑选出来
       begin
        checkfm.Canvas.Lock;
        datamodule5.ADOQuery2.Close;
        datamodule5.ADOQuery2.SQL.Clear;
        datamodule5.ADOQuery2.SQL.Add('select * from zf_data where 序号='''+inttostr(j)+'''');
        datamodule5.ADOQuery2.Open;
        s1:=datamodule5.ADOQuery2.FieldValues['品番'];//找出出库记录品番号
        a:=strtoint(datamodule5.ADOQuery2.FieldValues['容纳量']);//找出出库基本口出库数
        b:=strtoint(datamodule5.ADOQuery2.fieldvalues['补充量']); //找出出库记录入库数
        p:=strtoint(datamodule5.ADOQuery2.fieldvalues['额定收容数']);//找出出库记录现库存
        datamodule5.ADOQuery3.Close;
        datamodule5.ADOQuery3.SQL.Clear;
        datamodule5.ADOQuery3.SQL.Add('select * from zf_table where part_no= '''+s1+'''');
        datamodule5.ADOQuery3.Open;
        k2:=datamodule5.ADOQuery3.RecordCount;
         if k2=0 then      //没有暂放的默认为0
         begin
            y:=0;
         end
         else
         y:=0;
         WHILE not datamodule5.ADOQuery3.Eof do
          begin//将查询到的多条记录数量总和加起来
          y:=y+strtoint(datamodule5.adoquery3.FieldValues['zf_nu']);
          datamodule5.ADOQuery3.Next;
          end;         datamodule5.ADOQuery1.Close;
         datamodule5.ADOQuery1.SQL.Clear;
         datamodule5.ADOQuery1.SQL.Add('select * from parts where part_no='''+s1+'''');
         datamodule5.ADOQuery1.Open;
         z:=strtoint(datamodule5.ADOQuery1.FieldValues['bal_stock']);
         if z-y>a then
         begin
         datamodule5.total_query.Close;
         datamodule5.total_query.SQL.Clear;
         datamodule5.total_query.SQL.Add('select * from total_table where part_no='''+s1+'''and down_nu='''+inttostr(0)+''' and data='''+datetostr(DateTimePicker1.date)+'''');
         datamodule5.total_query.Open;
         count_up:=datamodule5.total_query.RecordCount;
         datamodule5.total_query.Close;
         datamodule5.total_query.SQL.Clear;
         datamodule5.total_query.SQL.Add('select * from total_table where part_no='''+s1+'''and up_nu='''+inttostr(0)+''' and data='''+datetostr(datetimepicker1.date)+'''');
         datamodule5.total_query.Open;
         count_down:=datamodule5.total_query.RecordCount;
         datamodule5.ADOQuery1.Close;
         datamodule5.adoquery1.SQL.Clear;
         datamodule5.ADOQuery1.SQL.Add('select * from parts where part_no='''+s1+'''');
         loc1:= datamodule5.adoquery1.fieldvalues['bin_loc'];
         datamodule5.ADOQuery5.Close;
         datamodule5.ADOQuery5.SQL.Clear;
         datamodule5.ADOQuery5.SQL.Add('insert into check_table values('''+s1+''','''+loc1+''','''+inttostr(count_up)+''','''+inttostr(count_down)+''','''+inttostr(0)+''','''+datetostr(datetimepicker1.date)+''')');
         datamodule5.ADOQuery5.execsql;
         end;
         j:=j+1;
         checkfm.Canvas.Unlock
         end;
        end;[
[/code]
求各位大大门指教,为什么会出现access violation错误,以前很好的,后来就不知怎么出现错误了

解决方案 »

  1.   

    try
    except
        Synchronize(showsql);
    end;加个TMythread成员变量msql,代码SQL.Add下面加个附值给msql.showsql过程将msql的值显示到主界面中,然后再看下哪里出错了。
      

  2.   

    怎么弄啊,我是菜鸟,不知加到那里,还有showsql是什么意思,怎么用?
      

  3.   


    TMythread=class(TThread)
        msql: string;
    private
      procedure showsql();
    protected
      procedure execute;override;
    end;procedure TMythread.execute;
    ......
    begin
        try
             FreeOnterminate:=true;
             DateTimePicker1.date:=now;
             j:=1;
             ......
             datamodule5.ADOQuery1.SQL.Add('select * from parts where part_no='''+s1+'''');
             msql := datamodule5.ADOQuery1.SQL.Text;
             datamodule5.ADOQuery1.Open;
             ......
             //其他相应的sql.add后都加上相应的msql := ......
        except
             Synchronize(showsql);
        end;
    end;
    procedure TMythread.showsql();
    begin
          Form1.memo1.line.add(msql);
    end;
      

  4.   

    erhan真是耐心好,早上看到这个帖子直接晕菜了。
    一堆1,2,3的数字命名。
    楼主注意编程规范啊。
    楼主,你在多线程中用ADO查询时,要动态创建,每个线程一个ADO连接。
    否则线程会死掉。
      

  5.   

    好像第一个的ado查询开始就开始有问题,是不是楼上所说的,线程死掉啊·
      

  6.   

    很有可能
    又仔细看了下,DateTimePicker1.date:=now;
    这样的也不行,访问form里的东东,都要象我用Synchronize那样使用的,不然会崩的
      

  7.   

    我将DateTimePicker1.date:=now;去掉之后
    依旧出现access violation错误,msql里的就是下一句的内容就是'select * from parts where part_no=0400922106,对应的程序语句就是在--datamodule5.ADOQuery1.SQL.Add('select * from parts where part_no='''+s1+'''');
      

  8.   

    访问form里的东东,都要象我用Synchronize那样使用的,不然会崩的
      

  9.   

    datamodule5是不是主窗体里的?
      

  10.   

    不是,是data module 界面,里面放的是adoconnection,adoquery和datasource3种
      

  11.   

    好,[email protected],非常感谢楼上两位。