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错误,以前很好的,后来就不知怎么出现错误了
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错误,以前很好的,后来就不知怎么出现错误了
except
Synchronize(showsql);
end;加个TMythread成员变量msql,代码SQL.Add下面加个附值给msql.showsql过程将msql的值显示到主界面中,然后再看下哪里出错了。
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;
一堆1,2,3的数字命名。
楼主注意编程规范啊。
楼主,你在多线程中用ADO查询时,要动态创建,每个线程一个ADO连接。
否则线程会死掉。
又仔细看了下,DateTimePicker1.date:=now;
这样的也不行,访问form里的东东,都要象我用Synchronize那样使用的,不然会崩的
依旧出现access violation错误,msql里的就是下一句的内容就是'select * from parts where part_no=0400922106,对应的程序语句就是在--datamodule5.ADOQuery1.SQL.Add('select * from parts where part_no='''+s1+'''');