这是我的记事本文件whconn.ini的内容:
[SERVER]
ServerName=Provider=SQLOLEDB.1;Persist Security Info=False;User ID='sa';Password='';Initial 
Catalog='whjxc';Data Source='center3'
以下是我写在应用程序服务器中远程数据模块中的一个初始化过程:
var
  connini:TINIFile;
  LocalDir:String;
  sServer:String;
  sBaseName:String;
  sUserID:String;
  sPassword:String;
  sConn:string;
begin
  { Update the client counter }
  MainForm.UpdateClientCount(1);
  GetDir(0,LocalDir);
  //打开初始化文件,取得连接参数
  connini:=TINIFile.Create(LocalDir+'\whconn.ini');
  sServer:=connini.ReadString('SERVER','sServer','Error');
  sBaseName:=connini.ReadString('SERVER','sBasename','Error');
  sUserID:=connini.ReadString('SERVER','User ID','Error');
  sPassword:=connini.ReadString('SERVER','Password','Error');
   //连接参数拼接完毕,不显示登录提示对话框
  dataconn.Connected:= False;
  dataconn.LoginPrompt:= true
  sConn:='Provider=SQLOLEDB.1;Persist Security Info=False;'+'User ID='+sUserID+';Password='+sPassword+';Initial Catalog='+sBasename+';Data Source='+sServer+';';
  dataconn.ConnectionString:=sConn;
  dataconn.Connected:=True; 
end;
在两层里面一点问题都没有,可是改成三层之后,就调用不了记事本里的内容了,如果在程序里手动加入连接信息,客户端就可以调用,请各位大侠指点指点我吧!谢谢!

解决方案 »

  1.   

    问题可能就处在这个地方:
    connini:=TINIFile.Create(LocalDir+'\whconn.ini');换成三层後,路径有没有不对?
      

  2.   

    to  bigysw(大花脸):谢谢你!
    路径应该是对的,因为以前在客户端,这个ini文件就放在客户端了,而现在改为三层后,我是在应用程序服务器端调用的,就把ini文件放到应用程序服务器端了。可不知为什么总是取不到这中文件中的内容。
      

  3.   

    你的程序运行后是由COM去读取你的INI,你知道中间层的几个不允许?
    1,不进行IO操作;
    2,不进行SOCKET操作;
    3
      

  4.   

    你检查一下远程模块创建时有没有调用此初始化过程,应该没有问题,我也是这样做的,代码如下procedure TMainForm.FormCreate(Sender: TObject);
    var
      ConIniFile: TIniFile;
    begin
      ClientCount:=0;
      DisplayClient;  ConnectionStr:='';
      ConIniFile := TIniFile.Create(MWorkPath+'AdoCon.ini');
      ConnectionStr:= ConIniFile.ReadString('connection', 'constr', 'null') ;
      ConIniFile.Free;
    end;
    procedure TManageRDM.RemoteDataModuleCreate(Sender: TObject);
    var
      // 2002-7-9 dyf
      XMLFileName: string;
      ConnctProp:TConnctProp;
    begin
      QueryDM:=TQueryDM.Create(nil);
      ProcedureDM:=TProcedureDM.Create(nil);
      if MainForm.ConnectionStr<>'null' then  begin
        ADOConCost.Connected:=False;
        ADOConCost.ConnectionString:= MainForm.ConnectionStr;
        ADOConCost.Connected:=True;
      end;
      // 2002-7-9 dyf
      //读取连接的配置文件
      XMLFileName:=MWorkPath + 'connparams.xml'; //配置文件的全路经
      XMLDocument1.filename:=XMLFileName;
      XMLDocument1.active:=true;
      ConnctProp:=TConnctProp.Create;
      ConnctProp.LoadFromXMLDoc(self,XMLDocument1);  Inc(MainForm.ClientCount);
      MainForm.DisplayClient;
    end;
      

  5.   

    我曾经遇到过这个问题,就是将一个没有问题的ini和应用程序copy到另外一个地方,就不能正常读取了,注意 LocalDir 是相对路径,还是绝对路径。这种操作跟几层没有关系!
      

  6.   

    如果是EXE类型的中间层,把LocalDir改用ExtractFilePath( Application.ExeName );应该就可以了,如果是DLL类型的中间层就麻烦一些,要把INI放在其宿主程序的目录,如COM+就要把INI放在System/System32目录下.
      

  7.   

    to dyf2001():谢谢你!
    还是不行啊!我一到客户端连接时,就提示连接不到数据库,也就是找不到INI文件里的内容。
      

  8.   

    to Raptor(猛禽):谢谢你,我这就去试一试!
      

  9.   

    那你打开两个delphi同时调试一下client和server,看远程数据模块创建时有什么问题。
      

  10.   

    to dyf2001():谢谢!
    出现的问题是:SQL Server不存在或访问被拒绝。
      

  11.   

    有碰到过这个情况 原因是路径的问题 你可以在连接之前showmessage(ConnectionString)看一下是不是你想要的
      

  12.   

    我也曾经遇到过类似的问题,不过我当时是开发COM组件的时候,
    我解决的方式是发布一个属性,专门用来存储这个INI文件的路径
    这样就可以顺利的读出,不会出现找不到INI文件的问题,对于
    三层里面来说,MIDAS其实也是一些什么接口之类的,封装过后的
    COM,你也可以发布同样的属性,使用Type Libray,可以弹出一个
    xxx.tlb的窗口,那里可以发布属性试试吧,祝你好运ePing
      

  13.   

    ini文件拷贝到winnt\system32(winnt)下或windows\system(win98)下
      

  14.   

    若应用服务器未安装到COM+环境,则ini文件应与客户exe在同一目录。
      

  15.   

    各位有知道怎样进行COM注册吗?多谢!
      

  16.   

    to  Raptor(猛禽):谢谢你!
    我已经注册了,可还是连不上?!
      

  17.   

    楼上兄台,你到底是什么方式做的中间层?
    DCOM的EXE方式?
    MTS/COM+的DLL方式?
    做法不同的
      

  18.   

    to Raptor(猛禽):谢谢你的热心帮助!
    我用的是DCOM的EXE方式。
      

  19.   

    to  tantengfei(苦口苦乐):谢谢你!
    试成功之后能告诉我吗?
      

  20.   

    我的也是这种方式的,没有什么问题,
    ini文件放在系统目录下 D:\Winnt
    你可以参考一下procedure TSrvDM.RemoteDataModuleCreate(Sender: TObject);
    var
      sServerName, sUserID, sPwd: string;
      iniFile: TIniFile;
      sConn: string;
    begin  IniFile := TIniFile.Create( 'DBConn.ini');
      sServerName := iniFile.ReadString('ADOConnection', 'Server Name', '');
      sUserID := iniFile.ReadString('ADOConnection', 'User ID', '');
      sPwd := ReadPass('Password', 8);
      sConn := 'Provider=SQLOLEDB.1;Password= ' + sPwd + ';Persist Security Info=False;User ID= ' + sUserID + ';Data Source=' + sServerName +';';
      sConn := sConn + 'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;';
      sConn := sConn + 'Workstation ID=' + sServerName + ';Use Encryption for Data=False;Tag with column collation when possible=False';
      FServerName := sServerName;
      with ADOConnection1 do
      begin
        if Connected then
          Close;
        ConnectionString := sConn;
        Connected := True;
      end;
    end;
      

  21.   

    我的Ini文件内容很简单[ADOConnection]
    Server Name = wjg
    User ID = organdbo
    password = 888888你可以跟踪看看从Ini文件读出的值是否正确
      

  22.   

    谢谢你:kingting(萧羽)!
    我去试一试,如果成功我会告诉你的。
      

  23.   

    to kingting(萧羽):还是不行,就是读不到记事本中的内容。
      

  24.   

    你的TADOConnection元件不能放在远程数据模块上,这样会引起名称冲突,应该放在公用模块上,如服务器主单元(MainForm)。
      

  25.   

    补充:初始化语句也应该在MainForm进行
      

  26.   

    你可以把设计时手动加入的连接信息赋值给sConn
    然后再, 
      dataconn.ConnectionString:=sConn;
      dataconn.Connected:=True; 因为你手动设置是正确的,如果现在可以连接的话,那问题只能出现在你读Ini文件了。
    再如确认是读Ini文件出错,那你可以跟踪一下是你先建立连接还是先读取Ini文件。把问题的范围慢慢缩小,最终定会找到并解决…
      

  27.   

    我试过了,把INI文件和EXE文件放在一个目录里,用ExtractFilePath( Application.ExeName ) + 'whconn.ini'即可取到此INI文件。
      

  28.   

    to kingting(萧羽):非常地感谢你!
    你按照你上面所写的,把ini放到D:\Winnt就成功了,还有我的这个LocalDir这个相对路径,我按照你那么做就行了。真是太谢谢你了,我另开一贴,你来接分!
    也谢谢大家的不断帮助与参与,马上结贴!