我是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.感谢你阅读本贴,希望你能给我指导和顶贴.
希望各位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.感谢你阅读本贴,希望你能给我指导和顶贴.
然后动态的创建 adotable adoquery adoconnection 等 然后把连接字符串赋值给他 打开数据库其他操作和平时一样。
uses: ADODB, DB;
在程序中
var
ADOTable1: TADOTable;
begin
adotable1:=tadotable.Create(self);
adotable1.ConnectionString =str;
等其他相同就可以用了
上面有adoquery...等连数据库的控件。
你在unit中把创建的data module 单元引用进来。
function GetSql(asql : string ):boolean;
var
aDataModule :TnewDataModule;//(data module)
begin
aDataModule = TDataModule.Create(nil);
aDataModule.Adoquery1.clsoe;
/..............
end;
上面的代码有点不规范,意思就是那了。
initialization中添加CoInitialize (nil);
finalization中添加CoUninitialize();
这些语句应该写在那个unit中?
////////////////////
你在哪个单元中用到ado控件了,就写到哪个单元的初始化中
怎样使dm不被多次调用而多次创建呢?即怎样判断dm已被创建呢?
>>finalization中添加CoUninitialize();这是典型不妥的做法,呵呵。
===============
1.贴是很多,但我没有找到合适的.
2.关于在dll中用ado的更难找到.
3.初学,我希望是我提出想法和疑问能得到正确的指导和解决.
4.时间比较紧可以给我做个例程吗?(包括运行T-SQL和存储过程的) [email protected]
还有一点是我本身delphi的基础只有一点,所以对于我来说,有一定难度的.
比如
Function FUn1(aQuery:Tadoquery......).....
或是
Function Func2(aFieldName,aKEy).....
var
tempadoqry:Tadoquery
begin
TempAdoqry:=Tadoquery.create(nil);
tempadoqry.sql.add('select '+afieldname++' from ...where .....
end;
http://community.csdn.net/Expert/topic/3844/3844330.xml?temp=.2971613
initialization
CoInitialize (nil);
finalization
CoUninitialize();
就可以啊。
如果你DLL的主程序调了,别人调你DLL函数的时候就不用调了,此时你的函数只返回数值给调用者如果你的DLL中还要创建用ADO窗体的话,应该有个主函数来创建,并初始化COM
在Data Moudle的unit中加入
initialization
CoInitialize (nil);
finalization
CoUninitialize();
就可以啊。
=======================
这个操作我做过了.不然程序死的更惨.
================
感谢你提供的源码,我已经解决了比较多的问题.
为了回报大家,这帖先结,分先给了.
我还有一下问题.大家可以在来看看
http://community.csdn.net/Expert/topic/3862/3862146.xml?temp=.9383661