一个COM+组件用ADO连接数据库服务器上数据,并向客户端提供数据集。
我想用一个初始化文件提供数据库服务器名,在COM+组件创建时给
ADOCONNECTION.CONNECTEDSTRING赋值。但失败了。
请问高手怎样用初始化文件给COM+组件里的ADOCONNECTION的数据库
赋值??谢谢!!
环境:WIN2000+D6+MSSQL2000

解决方案 »

  1.   

    我觉的你可以在TMtsDataModule的Create事件里写连接代码。
    但是我会将com组件和数据库安装在同一台机器上,直接在连接串中指定(local)。
      

  2.   

    TO WangPeter(Peter):
    1.
      我“在TMtsDataModule的Create事件里写连接代码”,但是在COM+组件被
      激活时却报错呀,说什么“堆栈溢出”,原因就是连接数据库时出错。
    2.
      我现在是“我会将com组件和数据库安装在同一台机器上,直接在连接串中指
      定(local)。”这样做的,但是人家用户要把组件与数据库服务器分开放呀!
    3.
      当然也可以直接在COM+组件里把数据库服务器的名称写死(这是没办法的办
      法了),但我想这样在开发与发布时就要改来改去的,有时忘了改又出错。
    ================================================================
    谢谢关注!
      

  3.   

    我刚才做了测试,
    procedure TDOModule.MtsDataModuleCreate(Sender: TObject);
    begin
      ADOConn.ConnectionString := '...';
    end;
    运行正常啊。
    注:我采取的是早期绑定,嵌套调用,所以采用晚期绑定,直接调用要修改不少代码,所以没有测试。
      

  4.   

    不过我认为在create事件中写连接代码不会出错的。“堆栈溢出”这类错误可能是死循环引起的。
      

  5.   

    TO WangPeter(Peter) :
    请问你设计期的“ADOConn.ConnectionString ”属性
    设置了没有?
    我设置成已知数据库,
    (但是它的CONNECTED属性设置为FALSE)
    不出错(我知道它肯定是用这个已知的数据库)
    但如果在设计期把它置为空的话,
    再在MtsDataModuleCreate事件里赋值的话,
    就失败。
    =======================================
    另外就是:
    怎样在COM+组件里向客户端提供自定义的函数?
    (希望提供一些代码参考)
      

  6.   

    怎样在COM+组件里向客户端提供自定义的函数?
    (希望提供一些代码参考)
      

  7.   

    ADOCONNECTION.CLOSE; //怀疑是在设计期间就连接了//最好动态连接
    ADOCONNECTION.CONNECTEDSTRING := '... ...';
      

  8.   

    我想不是赋值的问题,而是值不正确,
    用ShowMessage测试一下字符串。
      

  9.   

    TO  testnet(testnet):
    “我想不是赋值的问题,而是值不正确,
    用ShowMessage测试一下字符串。”
    对于组件怎样用ShowMessage?
    ======================
    而且值应该是正确的,(在设计期正确。)
    ======================
    我现在担心的问题就是:
    COM+组件里的ADOCONNECTION可不可以
    在MtsDataModuleCreate事件里指定数据库???
    (比如说去.ini文件里读取数据库服务器名称)
    ======================
    谢谢关注!
      

  10.   

    >>COM+组件里的ADOCONNECTION可不可以在MtsDataModuleCreate事件里指定数据库???
    可以,我就是在INI中配置的。
      

  11.   

    //我的代码如下:(麻烦大家看一下是哪里有问题)
    (*==========================================
      ==                                      ==
      ==         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
      

  12.   

    代码应该没有错……
    1 你检查一下设计期间Connected 是否的确为false
    2 检查一下动态组成的coneectstring是否正确(你可以把它写到那个配置文件中去)
    3 会不会在initdata执行前open了一个表?
    4 跟踪一下看看
      

  13.   

    To windindance(风舞轻扬):
    << 4 跟踪一下看看
    请问怎么跟踪执行COM+组件呀?
    =========================
    我现在是把数据库服务器名字
    写死。
    各位高手我究竟错在哪里呀?
      

  14.   

    数据库连接那段代码应该没什么错。不过不知道你是否在连接之前就调用数据库操作。还有溢出错误好像和数据库连接没什么关系的,一般都报连接失败而已。关于COM的调试说起来比较麻烦,不过因为你在本机调试,可以用showmessage来调试。比如:
    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;
    这样你可以通过显示的信息来判断是否连接的时候出错。
      

  15.   

    我猜是你的InitData方法出错了。
      

  16.   

    跟踪DLL:
    Run-Parametes
    Host ApplicationD:\WINNT\system32\dllhost.exeparameters:
    /ProcessID:{7B476CAF-AC85-4ABF-9849-0F2D067A1B63}
    (这儿的GUID取得方法:
    程序-管理工具-组件服务-你的组件-属性-应用程序ID)
      

  17.   

    谢谢各位的关注与帮助。
    问题现在得以解决,
    但是我却还不知症结所在。
    我只是重新建了一个PROJECT,
    然后把所有的数据控件以及
    代码复制过去编译,再安装
    COM+组件,竟然一切OK!
    然后我就去一个劲地对比
    两者的差异竟找不出半点
    差异(可能是没找出!!!)
    这究竟是怎么回来呢。
    没关系问题解决了就高兴了。
    谢谢各位的关心!!!!!