我是Delphi的初学者,现在学习编写DLL.在其中用到了ADO连接数据库,但发现问题比较多,
希望各位Delphi的高手指教帮助.
1.在Dll中,我建立了一个Data Module,在其中放置了ADOConnection,ADOCommand,ADOProcedure,
然后我想编写相关的函数,分别用于连接SQL数据库,运行SQL语句,运行存储过程等,是否应该把那些
函数写在一个unit中(不一定是放在属于那个Data Moudle的unit中)?2.查到一些资料,说如果delphi的Dll中用到Ado那么要在
initialization中添加CoInitialize (nil);
finalization中添加CoUninitialize();
这些语句应该写在那个unit中?3.还有,就是第一个问题里说的函数不会写啊,大家贴一下把.注意,运行是SQL语句时我要支持事务回滚的.4.我主要是希望这样能让使用该DLL的人来说,不要考虑数据库的结构,也可以达到某些操作数据的功能.
因为不懂,所以希望大家提提意见,我应该如何构造这个dll.感谢你阅读本贴,希望你能给我指导和顶贴.

解决方案 »

  1.   

    dll传递的函数是  string型的连接     然后和数据库的名字
    然后动态的创建  adotable  adoquery   adoconnection 等  然后把连接字符串赋值给他  打开数据库其他操作和平时一样。
    uses:  ADODB, DB;  
    在程序中
    var
        ADOTable1: TADOTable;
    begin
       adotable1:=tadotable.Create(self);
       adotable1.ConnectionString =str;
    等其他相同就可以用了
      

  2.   

    既然你用了Data Module
    上面有adoquery...等连数据库的控件。
    你在unit中把创建的data module 单元引用进来。
    function GetSql(asql : string ):boolean;
    var
      aDataModule :TnewDataModule;//(data module)
    begin
      aDataModule = TDataModule.Create(nil);
      aDataModule.Adoquery1.clsoe;
      /.............. 
    end;
    上面的代码有点不规范,意思就是那了。
      

  3.   

    2.查到一些资料,说如果delphi的Dll中用到Ado那么要在
    initialization中添加CoInitialize (nil);
    finalization中添加CoUninitialize();
    这些语句应该写在那个unit中?
    ////////////////////
    你在哪个单元中用到ado控件了,就写到哪个单元的初始化中
      

  4.   

    如果dll中用到了ado,而且应用程关闭时connection没有关闭,那么程序就会报地址错误.
      

  5.   

    还有,因为要这样application.CreateForm(tdm,dm);
    怎样使dm不被多次调用而多次创建呢?即怎样判断dm已被创建呢?
      

  6.   

    关于ADO CSDN讨论过不知道多少次了,没必要每次都重复讨论。。楼主慢慢翻一些以前的贴子。>>initialization中添加CoInitialize (nil);
    >>finalization中添加CoUninitialize();这是典型不妥的做法,呵呵。
      

  7.   

    halfdream(哈欠)
    ===============
    1.贴是很多,但我没有找到合适的.
    2.关于在dll中用ado的更难找到.
    3.初学,我希望是我提出想法和疑问能得到正确的指导和解决.
    4.时间比较紧可以给我做个例程吗?(包括运行T-SQL和存储过程的)  [email protected]  
    还有一点是我本身delphi的基础只有一点,所以对于我来说,有一定难度的.
      

  8.   

    我考虑你的应用问题不需要使用DLL这样方式,就算要代码重用可用其它方法试试。
      

  9.   

    建议在你的函数中将ado的各个控件都作为参数,这样可能方便 点
    比如
    Function FUn1(aQuery:Tadoquery......).....
    或是
    Function Func2(aFieldName,aKEy).....
    var
      tempadoqry:Tadoquery
    begin
      TempAdoqry:=Tadoquery.create(nil);
      tempadoqry.sql.add('select '+afieldname++' from ...where .....
    end;
      

  10.   

    我发给你的程序需要安装Raize3.10控件包,在www.2ccc.com有下载。
      

  11.   

    借貴地一用!
    http://community.csdn.net/Expert/topic/3844/3844330.xml?temp=.2971613
      

  12.   

    在Data Moudle的unit中加入
    initialization
      CoInitialize (nil);
    finalization
      CoUninitialize();
    就可以啊。
      

  13.   

    谁要调DLL中的ADO,谁就要CoInitialize (nil),
    如果你DLL的主程序调了,别人调你DLL函数的时候就不用调了,此时你的函数只返回数值给调用者如果你的DLL中还要创建用ADO窗体的话,应该有个主函数来创建,并初始化COM
      

  14.   

    xiaochensu(拒绝水的鱼) 
    在Data Moudle的unit中加入
    initialization
      CoInitialize (nil);
    finalization
      CoUninitialize();
    就可以啊。
    =======================
    这个操作我做过了.不然程序死的更惨.
      

  15.   

    youcheng1(晓松) 
    ================
    感谢你提供的源码,我已经解决了比较多的问题.
    为了回报大家,这帖先结,分先给了.
    我还有一下问题.大家可以在来看看
    http://community.csdn.net/Expert/topic/3862/3862146.xml?temp=.9383661