一个COM+组件用ADO连接数据库服务器上数据,并向客户端提供数据集。
我想用一个初始化文件提供数据库服务器名,在COM+组件创建时给
ADOCONNECTION.CONNECTEDSTRING赋值。但失败了。
请问高手怎样用初始化文件给COM+组件里的ADOCONNECTION的数据库
赋值??谢谢!!
环境:WIN2000+D6+MSSQL2000
我想用一个初始化文件提供数据库服务器名,在COM+组件创建时给
ADOCONNECTION.CONNECTEDSTRING赋值。但失败了。
请问高手怎样用初始化文件给COM+组件里的ADOCONNECTION的数据库
赋值??谢谢!!
环境:WIN2000+D6+MSSQL2000
解决方案 »
- fastreport怎么连续打印多张
- 民币2000请高手修改2个程序,要求非常熟悉WINDOWS内核编程
- 为什么我的Delphi8用不了的
- Ado+Delphi6+access数据库如何用流将图片存储和读出?看了很多贴都没找到答案,那位高人给我发个例子,百分相赠[email protected]
- vc中的Struct转换成Delphi的Record型,帮我看看!!!!!!!
- 登陆窗体的问题?
- 紧急等待
- 文件删除的问题
- 急问,我的程序为什么编译不了成exe文件
- 如何将一个二维数组作为函数function的参数传递,且二维数组的维数可变?
- 哪位老大有用COM+开发的三层结构的程序,麻烦给小弟看看。
- 关于DBNavigator的问题,下面的功能能否实现?如何实现?
但是我会将com组件和数据库安装在同一台机器上,直接在连接串中指定(local)。
1.
我“在TMtsDataModule的Create事件里写连接代码”,但是在COM+组件被
激活时却报错呀,说什么“堆栈溢出”,原因就是连接数据库时出错。
2.
我现在是“我会将com组件和数据库安装在同一台机器上,直接在连接串中指
定(local)。”这样做的,但是人家用户要把组件与数据库服务器分开放呀!
3.
当然也可以直接在COM+组件里把数据库服务器的名称写死(这是没办法的办
法了),但我想这样在开发与发布时就要改来改去的,有时忘了改又出错。
================================================================
谢谢关注!
procedure TDOModule.MtsDataModuleCreate(Sender: TObject);
begin
ADOConn.ConnectionString := '...';
end;
运行正常啊。
注:我采取的是早期绑定,嵌套调用,所以采用晚期绑定,直接调用要修改不少代码,所以没有测试。
请问你设计期的“ADOConn.ConnectionString ”属性
设置了没有?
我设置成已知数据库,
(但是它的CONNECTED属性设置为FALSE)
不出错(我知道它肯定是用这个已知的数据库)
但如果在设计期把它置为空的话,
再在MtsDataModuleCreate事件里赋值的话,
就失败。
=======================================
另外就是:
怎样在COM+组件里向客户端提供自定义的函数?
(希望提供一些代码参考)
(希望提供一些代码参考)
ADOCONNECTION.CONNECTEDSTRING := '... ...';
用ShowMessage测试一下字符串。
“我想不是赋值的问题,而是值不正确,
用ShowMessage测试一下字符串。”
对于组件怎样用ShowMessage?
======================
而且值应该是正确的,(在设计期正确。)
======================
我现在担心的问题就是:
COM+组件里的ADOCONNECTION可不可以
在MtsDataModuleCreate事件里指定数据库???
(比如说去.ini文件里读取数据库服务器名称)
======================
谢谢关注!
可以,我就是在INI中配置的。
(*==========================================
== ==
== MainData.pas ==
== ==
========================================*)
unit MainData;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComServ, ComObj, VCLCom, StdVcl, bdemts, DataBkr, DBClient, IniFiles, Mtx,
MtsRdm, PersonServer_TLB, DB, ADODB, Provider;type
TPersonManagerServer = class(TMtsDataModule, IPersonManagerServer)
KjData: TADOConnection;
tblPersonInfo: TADOQuery;
tblUser: TADOQuery;
dsptblPersonInfo: TDataSetProvider;
dsptblUser: TDataSetProvider;
procedure MtsDataModuleCreate(Sender: TObject);
private
{ Private declarations }
procedure InitData;
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
public
{ Public declarations }
end;var
PersonManagerServer: TPersonManagerServer;implementation{$R *.DFM}procedure TPersonManagerServer.InitData;
var
fileInit: TiniFile;
fileName: string;
strHost,strDatabase, strConn: string;
lp: array[0..255] of Char;
begin
Windows.GetModuleFileName(HInstance,lp,150);
fileName := ExtractFilePath(string(lp)) + 'Server.ini';
if FileExists(fileName) then
begin
try
if KjData.Connected then KjData.Connected := False;
fileInit := Tinifile.Create(fileName);
strHost := fileInit.ReadString('SET','HostName','');
strDatabase := fileInit.ReadString('SET','Database','');
strConn := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog='+strDatabase+';Data Source='+strHost+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False';
KjData.ConnectionString := strConn;
KjData.Connected := True;
finally
fileInit.Free;
end;
end;
end;class procedure TPersonManagerServer.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;procedure TPersonManagerServer.MtsDataModuleCreate(Sender: TObject);
begin
InitData;
end;initialization
TComponentFactory.Create(ComServer, TPersonManagerServer,
Class_PersonManagerServer, ciMultiInstance, tmApartment);
end.
(*==========================================
== ==
== MainData.dfm ==
== ==
========================================*)
object PersonManagerServer: TPersonManagerServer
OldCreateOrder = False
OnCreate = MtsDataModuleCreate
Pooled = False
Left = 189
Top = 135
Height = 291
Width = 463
object KjData: TADOConnection
ConnectionString =
'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
'al Catalog=PersonManager;Data Source=DBServer;Use Procedure for ' +
'Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption fo' +
'r Data=False;Tag with column collation when possible=False'
LoginPrompt = False
Provider = 'SQLOLEDB.1'
Left = 24
Top = 8
end
object tblPersonInfo: TADOQuery
CacheSize = 1000
Connection = KjData
CursorType = ctStatic
Parameters = <>
Prepared = True
SQL.Strings = (
'select * from tblPersonInfo'
'order by fName')
Left = 24
Top = 72
end
object tblUser: TADOQuery
CacheSize = 1000
Connection = KjData
CursorType = ctStatic
Parameters = <>
Prepared = True
SQL.Strings = (
'select * from tblUser'
'order by fUserId')
Left = 116
Top = 72
end
object dsptblPersonInfo: TDataSetProvider
DataSet = tblPersonInfo
Constraints = True
Options = [poAllowMultiRecordUpdates, poAllowCommandText]
Left = 24
Top = 152
end
object dsptblUser: TDataSetProvider
DataSet = tblUser
Constraints = True
Options = [poAllowMultiRecordUpdates, poAllowCommandText]
AfterApplyUpdates = dsptblUserAfterApplyUpdates
Left = 120
Top = 152
end
end
1 你检查一下设计期间Connected 是否的确为false
2 检查一下动态组成的coneectstring是否正确(你可以把它写到那个配置文件中去)
3 会不会在initdata执行前open了一个表?
4 跟踪一下看看
<< 4 跟踪一下看看
请问怎么跟踪执行COM+组件呀?
=========================
我现在是把数据库服务器名字
写死。
各位高手我究竟错在哪里呀?
if FileExists(fileName) then
begin
try
if KjData.Connected then KjData.Connected := False;
fileInit := Tinifile.Create(fileName);
strHost := fileInit.ReadString('SET','HostName','');
strDatabase := fileInit.ReadString('SET','Database','');
strConn := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog='+strDatabase+';Data Source='+strHost+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False';
ShowMessage('1');-------------加这里
KjData.ConnectionString := strConn;
Showmessage(strConn);----------这里
KjData.Connected := True;
showmessage('2');-----------这里
finally
fileInit.Free;
end;
这样你可以通过显示的信息来判断是否连接的时候出错。
Run-Parametes
Host ApplicationD:\WINNT\system32\dllhost.exeparameters:
/ProcessID:{7B476CAF-AC85-4ABF-9849-0F2D067A1B63}
(这儿的GUID取得方法:
程序-管理工具-组件服务-你的组件-属性-应用程序ID)
问题现在得以解决,
但是我却还不知症结所在。
我只是重新建了一个PROJECT,
然后把所有的数据控件以及
代码复制过去编译,再安装
COM+组件,竟然一切OK!
然后我就去一个劲地对比
两者的差异竟找不出半点
差异(可能是没找出!!!)
这究竟是怎么回来呢。
没关系问题解决了就高兴了。
谢谢各位的关心!!!!!