try
    CoInitialize(nil);  //加了此 。还是出错
    sSql:='select * from DetRes ';
    with FGAdoQuery do
    begin
      Close;
      Connection := FADOConnect;
      SQL.Clear;
      SQL.Add(sSql); //只要一给ADOQ 赋SQL语句就出错  提示地址错误
      //Text := sSql;     //FAdoQuery 此处经常出错,为什么 ?是不是我的控件名字和系统的重复了?将控件名称换为FGAdoQuery 还出错
      //Prepared;
      Open;
  finally
    CoUninitialize;
  end;但这一个过程,在同一程序中,主单元调用此过程却没有错。
//下面是此控件的生成部分
FGAdoQuery := NewQuery(FADOConnect,'FAdoQuery');
function NewQuery(FADOConnect:TADOConnection;sQName:String):TAdoQuery;
begin
  Result:=TADOQuery.Create(Application);
  Result.Connection:=FADOConnect;
  Result.Name := sQName;
  Result.SQL.Text := '';
end;

解决方案 »

  1.   

    一般不会。Query没有关闭?初始化不成功?ParamCheck = False?
      

  2.   

    算是多线程吧,用了TTimer组件,在它里面的。
      

  3.   

    ParamCheck := False 加上此句也不出错啊。
      

  4.   

    ParamCheck := False 加上此句也还出错。
      

  5.   

    把些处屏蔽掉,其它第一次用到ADOQUERY.sql 的地方出错了。
      

  6.   

      try
        CoInitialize(nil);  //加了此 。还是出错 //如果你用到了com或者是ActiveX的内容才使用,否则就没必要了。
        sSql:='select * from DetRes ';
        with FGAdoQuery do
        begin
          Close;
          Connection := FADOConnect;
          SQL.Clear;
          SQL.Add(sSql); //只要一给ADOQ 赋SQL语句就出错  提示地址错误
          //Text := sSql;    //FAdoQuery 此处经常出错,为什么 ?是不是我的控件名字和系统的重复了?将控件名称换为FGAdoQuery 还出错
          //Prepared;
          Open;
      finally
        CoUninitialize; 
      end; 提示地址错误,指你没有创建就访问了,由此看出,错误不在这里。
    另外一种是,你把对象释放了,指针还保留的话也会报告地址错误。
    设置断点跟踪一下,看看到底是哪里错了?
    整体来看,这段代码没有什么大问题。
      

  7.   

    如果整体把这段代码给 屏蔽掉的话, 下面 给ADO控件 赋SQL语句时出错。
      

  8.   

    估计是FADOConnect不是有效的对象或者FADOConnect的connectionstring连接错误
    添加一个adoconnection,并且手动先连接好试试
      

  9.   

    FADOConnect是有效的对象因为通过主窗体调用 这个过程就没错,正在一步步跟踪看这个数据集为什么会出错。
      

  10.   

    什么叫算是多线程?是多线程就是多线程,不是多线程就不是多线程。至于用不用Timer跟是否多线程没有直接联系。
    如果是多线程,比A线程创建的ADOQuery之类的,要给B线程用,那么CoInitialize(nil);就要改为CoInitializeEx(Nil,COINIT_MULTITHREADED);
      

  11.   


    呵呵,算是多进程,用了TTimer 组件,好多代码都在时钟控件中运行。
      

  12.   

    地址错误?大哥,你估计连ADOQuery都没创建成功吧?
      

  13.   

    当然 创建了。  DTest.FGAdoQuery.Close;             //调试用,回头记得删除
      DTest.FGAdoQuery.SQL.Text := 'select * from detres';
        DTest.FGAdoQuery.Open;
      if   DTest.FGAdoQuery.recordcount > 0 then
        MessageBox(0, '有数据', '正常', MB_OK);
    在前面一些地方还能调用啊。
      

  14.   

    拜托,我前面已经说过了TTimer跟多线程没有任何关系。是否多线程就是有没有用到TThread或者CreateThread,这里指你程序当中显式使用的。
      

  15.   

    如果是在Timer当中使用,那么过程当中不要试图使用Application.ProcessMessage之类的。否则会因为Timer事件重入,而导致ADOQuery的操作混乱(前者访问还没有完成,后者又把它重新初始化...)
      

  16.   

    FGAdoQuery 
    没有创建吧?
      

  17.   

    自己找取问题,是ADOCONNECTION 的问题,如果不使用动态创建的 ADOCONNECTION  就没有问题了。
      

  18.   

    你看下 FADOQUERY 的釋入是如何處理的.數據集的連接 CONNECTION 你重點看下,跟蹤下他吧。個人感覺是這裏的問題你本身代碼應該是沒有錯的。
      

  19.   

    好像和ADODB.dcu有关。正在学习中
      

  20.   

    constructor TADOConnection.Create(AOwner: TComponent); 
    begin 
     inherited Create(AOwner); 
     FConnectionObject := CreateADOObject(CLASS_Connection) as _Connection; 
     OleCheck(ConnectionPoint.Advise(Self as IUnknown, FConnEventsID));     << 问题出在这 
     FCommands := TList.Create; 
     LoginPrompt := True; 
     FIsolationLevel := ilCursorStability; 
     CursorLocation := clUseClient; 
     FKeepConnection := True; 
    end;