各位大虾:
兄弟遇到一个问题,急需解决。在线程中调用主线程的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;
请大虾们指点!

解决方案 »

  1.   

    刚才发的代码是错的
    大家帮我看看这一段
    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; 
      

  2.   

    你本身就有问题,在线程里调用窗体的控件,这样很不好!
    你应该在创建线程的时候事件里,把ADOQuery当做一个参数传递时来,在线程里定义一个ADOQuery控件进行接收.或者你在DataModel(数据窗体里)执行这些代码!而通过线程调用DataModel中的执行函数.
      

  3.   

    adoquery是主窗体的数据集,你必须在线程中定义同样的adoquery控件,将外面ado=线程ado,这样就可以使用了