各位大虾:
兄弟遇到一个问题,急需解决。在线程中调用主线程的ADOQuery,按照ADOQuery1.FieldByName('TypeFlag').AsString取值赋给线程中定义的一个变量,程序运行出错:
错误信息:
Project Test.exe raised exception class EAccessViolation with message 'Access violation at address 0054C136 in module 'Test.exe'. Read of address 00000000', Process stopped. Use Step or Run to continue.
调试中止在赋值所在行的前一行。
本人使用的是Delphi7+Access的环境附代码如下:procedure TThread_InExcel.Execute;
var sql: String;
RowErrFlag: Integer;
CellText1: String;
begin
FreeOnTerminate := true;
try
TestForm.ADOQuery_Temp.Connection := DataModule_App.ADOConnection1;
TestForm.ADOTable1.First;
DataModule_App.ADOConnection1.BeginTrans;
While not TestForm.ADOTable1.Eof do
begin
RowErrFlag := 1;
CellText1 := Trim(DataForm_InExcel.ADOTable1.FieldByName('FactoryName').AsString);
if(CellText1='')then
begin
CellText1 := '-';
RowErrFlag := 3;
end;
CellText2 := Trim(DataForm_InExcel.ADOTable1.FieldByName('TypeName').AsString);
if(CellText2='')then
begin
CellText2 := '-';
RowErrFlag := 3;
end;
sql := 'insert into S_Product (FactoryName,TypeName,UpdateTime,RowFlag) values (:FactoryName,:TypeName,:UpdateTime,:RowFlag)';
TestForm.ADOQuery_Temp.Close;
TestForm.ADOQuery_Temp.SQL.Clear;
TestForm.ADOQuery_Temp.SQL.Add(sql);
TestForm.ADOQuery_Temp.Parameters.ParamByName('FactoryName').Value := CellText1;
TestForm.ADOQuery_Temp.Parameters.ParamByName('TypeName').Value := CellText2;
TestForm.ADOQuery_Temp.Parameters.ParamByName('UpdateTime').Value := Now();
TestForm.ADOQuery_Temp.Parameters.ParamByName('RowFlag').Value := RowErrFlag;
TestForm.ADOQuery_Temp.ExecSQL; TestForm.ADOTable1.Next;
end;
DataModule_App.ADOConnection1.CommitTrans;
self.Terminate;
except
DataModule_App.ADOConnection1.RollbackTrans;
self.Terminate;
end;
end;
请大虾们指点!
兄弟遇到一个问题,急需解决。在线程中调用主线程的ADOQuery,按照ADOQuery1.FieldByName('TypeFlag').AsString取值赋给线程中定义的一个变量,程序运行出错:
错误信息:
Project Test.exe raised exception class EAccessViolation with message 'Access violation at address 0054C136 in module 'Test.exe'. Read of address 00000000', Process stopped. Use Step or Run to continue.
调试中止在赋值所在行的前一行。
本人使用的是Delphi7+Access的环境附代码如下:procedure TThread_InExcel.Execute;
var sql: String;
RowErrFlag: Integer;
CellText1: String;
begin
FreeOnTerminate := true;
try
TestForm.ADOQuery_Temp.Connection := DataModule_App.ADOConnection1;
TestForm.ADOTable1.First;
DataModule_App.ADOConnection1.BeginTrans;
While not TestForm.ADOTable1.Eof do
begin
RowErrFlag := 1;
CellText1 := Trim(DataForm_InExcel.ADOTable1.FieldByName('FactoryName').AsString);
if(CellText1='')then
begin
CellText1 := '-';
RowErrFlag := 3;
end;
CellText2 := Trim(DataForm_InExcel.ADOTable1.FieldByName('TypeName').AsString);
if(CellText2='')then
begin
CellText2 := '-';
RowErrFlag := 3;
end;
sql := 'insert into S_Product (FactoryName,TypeName,UpdateTime,RowFlag) values (:FactoryName,:TypeName,:UpdateTime,:RowFlag)';
TestForm.ADOQuery_Temp.Close;
TestForm.ADOQuery_Temp.SQL.Clear;
TestForm.ADOQuery_Temp.SQL.Add(sql);
TestForm.ADOQuery_Temp.Parameters.ParamByName('FactoryName').Value := CellText1;
TestForm.ADOQuery_Temp.Parameters.ParamByName('TypeName').Value := CellText2;
TestForm.ADOQuery_Temp.Parameters.ParamByName('UpdateTime').Value := Now();
TestForm.ADOQuery_Temp.Parameters.ParamByName('RowFlag').Value := RowErrFlag;
TestForm.ADOQuery_Temp.ExecSQL; TestForm.ADOTable1.Next;
end;
DataModule_App.ADOConnection1.CommitTrans;
self.Terminate;
except
DataModule_App.ADOConnection1.RollbackTrans;
self.Terminate;
end;
end;
请大虾们指点!
大家帮我看看这一段
procedure TThread_InExcel.Execute;
var sql: String;
RowErrFlag: Integer;
CellText1: String;
CellText2: String;
begin
FreeOnTerminate := true;
try
TestForm.ADOQuery_Temp.Connection := DataModule_App.ADOConnection1;
TestForm.ADOTable1.First;
DataModule_App.ADOConnection1.BeginTrans;
While not TestForm.ADOTable1.Eof do
begin
RowErrFlag := 1;
CellText1 := Trim(TestForm.ADOTable1.FieldByName('FactoryName').AsString);
if(CellText1='')then
begin
CellText1 := '-';
RowErrFlag := 3;
end;
CellText2 := Trim(TestForm.ADOTable1.FieldByName('TypeName').AsString);
if(CellText2='')then
begin
CellText2 := '-';
RowErrFlag := 3;
end;
sql := 'insert into S_Product (FactoryName,TypeName,UpdateTime,RowFlag) values (:FactoryName,:TypeName,:UpdateTime,:RowFlag)';
TestForm.ADOQuery_Temp.Close;
TestForm.ADOQuery_Temp.SQL.Clear;
TestForm.ADOQuery_Temp.SQL.Add(sql);
TestForm.ADOQuery_Temp.Parameters.ParamByName('FactoryName').Value := CellText1;
TestForm.ADOQuery_Temp.Parameters.ParamByName('TypeName').Value := CellText2;
TestForm.ADOQuery_Temp.Parameters.ParamByName('UpdateTime').Value := Now();
TestForm.ADOQuery_Temp.Parameters.ParamByName('RowFlag').Value := RowErrFlag;
TestForm.ADOQuery_Temp.ExecSQL; TestForm.ADOTable1.Next;
end;
DataModule_App.ADOConnection1.CommitTrans;
self.Terminate;
except
DataModule_App.ADOConnection1.RollbackTrans;
self.Terminate;
end;
end;
你应该在创建线程的时候事件里,把ADOQuery当做一个参数传递时来,在线程里定义一个ADOQuery控件进行接收.或者你在DataModel(数据窗体里)执行这些代码!而通过线程调用DataModel中的执行函数.