在dll中定义:addrec(aquery:tadoquery;sdat:string);我想把sdat的内容通过Aquery添加到数据库中,aquery的实参为一个datamodule中的adoquery1,为什么我调用的时候会出现类似对象没有创建的错误提示?1、我已经包含了adodb,db
2、在调用之前,datamodule中的adoquery1已经建立

解决方案 »

  1.   

    正式的 :
    addrec(var aquery:tadoquery;const sdat:string):integer;
    begin
     with aQuery do
      begin
        close;
        SQL.Clear;
        SQL.Add('insert into atable(afield)');
        SQL.Add(' values(:patable)');
        Parameters.ParamByName('patable').Value := sdat;
        try
          ExecSQL;
          Result := 0;
        except
          Result := 1;
        end;
        close;
      end;
    end;
      

  2.   

    addrec(var aquery:tadoquery;const sdat:string):integer;
    begin
     with aQuery do
      begin
        close;
        SQL.Clear;
        SQL.Add('insert into atable(afield)');
        SQL.Add(' values(:patable)');
        Parameters.ParamByName('patable').Value := sdat;
        try
          ExecSQL;
          Result := 0;
        except
          Result := 1;
        end;
        close;
      end;
    end;
      

  3.   

    要不在你调用前,
    写上个adoquery1:=tadoquery.create;
    如何,
      

  4.   

    已开始就报错:好像是写错误
    好像记着:常量对象不能作为变量参数传递,adoquery1属于常量对象吗?
      

  5.   

    在 Dll 中使用 ADO 或者 COM,请先使用 CoInitializeint WINAPI DllEntryPoint(HINSTANCE, unsigned long, void*)
    {
        switch(reason)
        {
        case DLL_PROCESS_ATTACH:        //初始化 COM
            CoInitialize(NULL);
            break;
        case DLL_PROCESS_DETACH:        //释放 COM
            CoUninitialize();
            break;    case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        }
        return 1;
    }
      

  6.   

    问题的所在是:能不能将主程序的Com组件传给DLL函数.我曾经试过,好像不行的。估计因为DLL是Windows的机制,而Windows是C的,因此,必须是C能认识的参数类型。猜想而已,请高手指点
      

  7.   

    addrec(var aquery:tadoquery;const sdat:string):integer;
    const
      conSql=' values(''%s'')';
    var
      cSql:string;
    begin
     cSql:=format(cSql,[sdat]);
     with aQuery do
      begin
        close;
        SQL.Clear;
        SQL.Add('insert into atable(afield)');
        SQL.Add('cSql);
        try
          ExecSQL;
          Result := 0;
        except
          Result := 1;
        end;
        close;
      end;
    end;
      

  8.   

    以前遇到这个问题,后来问了高手,说是在query中的:Parameter 如果冒号在括号中的话,就识别不出来,我试验了一下,也是那样。
      

  9.   

    不会吧,俺用DLL来做数据浏览窗体都没问题呢?
      

  10.   

    忘了告诉楼主,不要传对象进入DLL,对象应在DLL内部声明,也要在DLL内部释放。
      

  11.   

    TO:lazycat818(lazycat818) 
    当然不是...你说的应该是跨套间访问COM对象的限制.(跨线程访问COM是跨套间访问COM情况之一)
    另外,楼主,抓异常的代码最好也要改一下..才容易发现问题..addrec(var aquery:tadoquery;const sdat:string):integer;
           ~~~~~~~~~~~这儿不需要这个VAR....是不是你调用DLL弄错了?
           
    begin
      try
        with aQuery do
        begin
          close;
          SQL.Clear;
          SQL.Add('insert into atable(afield)');
          SQL.Add(' values(:patable)');
          Parameters.ParamByName('patable').Value := sdat;
          ExecSQL;
          close;
          Result := 0;
        end;
      except on e:exception do
          Writelog(e.Message);//自定的函数,记录信息到日志文件.
          Result := 1;
      end;
    end;
      

  12.   

    dll中使用ADO组件一定要调用CoInitialize(nil);最后调用CoUninitialize;
      

  13.   

    String类型的问题吧,把它换成PCHAR吧,试试
      

  14.   

    那位大侠能讲讲Coinitalize怎么初始化吗?我是新手,不知道怎么用!谢谢了!盼回答!