首先我采用的是BDE,那么可以向dll传送一个database的handle,然后在dll中生成database来接受这个handle就可以了,但怎样向应用程序传送呢???
后来改为使用ado
我就想干脆使用中间层,在中间层用一个函数得到adoconnection的ConnectionObject,然后在客户端使用一个dcomconnection和一个adoquery组件,写上:
adoquery1.Connection.ConnectionObject:=iunknown(DCOMConnection1.AppServer.getdatac) as _connection;
(注:getdatac就是中间层用来返回connectionobject的函数)
可是运行到这句时,系统会报‘无效索引。’的错误,请问怎样解决这个问题???对于多个应用程序或者dll使用同一个数据库连接,请问大家还有没有什么好的办法???(主要是多个应用程序使用同一个数据库连接)
后来改为使用ado
我就想干脆使用中间层,在中间层用一个函数得到adoconnection的ConnectionObject,然后在客户端使用一个dcomconnection和一个adoquery组件,写上:
adoquery1.Connection.ConnectionObject:=iunknown(DCOMConnection1.AppServer.getdatac) as _connection;
(注:getdatac就是中间层用来返回connectionobject的函数)
可是运行到这句时,系统会报‘无效索引。’的错误,请问怎样解决这个问题???对于多个应用程序或者dll使用同一个数据库连接,请问大家还有没有什么好的办法???(主要是多个应用程序使用同一个数据库连接)
年一的DLL是用VC做的还是DELOHI?
dbName: OleVariant): OleVariant;
var
filename,Adostr:string;
begin
result:=0;//正常执行的返回值 AdoStr:='Provider=SQLOLEDB.1;'+
'Password='+PW+';'+
'Persist Security Info=True;'+
'User ID='+ UserID+';'+
'Initial Catalg='+ InitialCatalg+';'+
'Data Source='+ DataSource+';'+
'Use Procedure for Prepare=1;'+
'Auto Translate=True;'+
'Packet Size=4096;'+
'Use Encryption for Data=False;'+
'Tag with column collation when possible=False';//拼出你的ADO连接串 Filename:='AdoCon.ini';//ini文件的名字 if result=0 then
try
AdoIniFile:= Tinifile.Create(Filename);
except
result:=1;
end;//创建ini文件 if result=0 then
try
AdoIniFile.WriteString('DefaultSet','Set',dbName);
AdoIniFile.WriteString(dbName,'constr',Adostr);
AdoIniFile.WriteString(dbName,'defaultDatabase',InitialCatalg);
except
result:=2;
end;//把连接信息写进去 if result=0 then
try
AdoIniFile.Destroy;
except
result:=3;
end;//别忘了释放文件,呵呵。
end;
用户在打开你的子模块时又让用户作一次无谓的数据库连接等待,要是我也会烦了。不过还好,我已经算是解决了这个问题,就是将应用程序。EXE文件全部改为DLL程序,所有的动态连接库都使用一个数据库连接,用户在打开子模块时的速度问题终于解决了。而且也不用让每一个程序员改动他们的程序多少,就在调用时读一个连接对象就行了。