Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为RAD服务器动态设置数据库参数_Delphi_Iis_Isapi_Ems - Fatal编程技术网

Delphi 为RAD服务器动态设置数据库参数

Delphi 为RAD服务器动态设置数据库参数,delphi,iis,isapi,ems,Delphi,Iis,Isapi,Ems,我开发了一个通过IIS使用RAD服务器的应用程序。到目前为止,我已经成功地创建了服务器和客户端应用程序。该应用程序提供了一些需要根据服务器端的MSSQL数据库进行验证的信息。在测试环境中一切正常,因为我的数据库连接参数是在FDConnection组件中设置的 但是,我希望在访问服务器时通过读取ini文件来更改连接参数 在我的开发系统上,我可以将ini文件放在bpl输出所在的目录中。(即C:\Users\Username\Projects\Application\Server\Win32\Debu

我开发了一个通过IIS使用RAD服务器的应用程序。到目前为止,我已经成功地创建了服务器和客户端应用程序。该应用程序提供了一些需要根据服务器端的MSSQL数据库进行验证的信息。在测试环境中一切正常,因为我的数据库连接参数是在FDConnection组件中设置的

但是,我希望在访问服务器时通过读取ini文件来更改连接参数

在我的开发系统上,我可以将ini文件放在bpl输出所在的目录中。(即C:\Users\Username\Projects\Application\Server\Win32\Debug)。然后服务器正确读取ini文件并更新组件参数

我已根据RAD服务器文档在服务器上创建了目录,并已将所需的EMS文件放置在该目录中。(即:C:\inetpub\RADServer\EMSServer)由于这是EMSServer.ini文件所在的位置,我认为这将是放置ini文件的正确位置。如果从该目录启动EMSDevServer.exe,ini文件将正确读取,FDConnection参数将更新

但是,当我使用ISAPI DLL通过IIS启动RAD服务器时,由于数据库连接失败,似乎找不到ini文件

我尝试将ini文件放在C:\Users\Public\Documents\Embarcadero\EMS目录中,但也没有成功

下面是访问在DataModuleCreate上调用的ini文件的代码

procedure TdmSecurity.DataModuleCreate(Sender: TObject);
begin
  SetConnectionStr(FDConnectionSTIKS);
end;

procedure SetConnectionStr(var FDConnectionSTIKS: TFDConnection);
var ConfigIni: TInifile;
    DBServerName, DBName, Path: string;
begin
  Path := GetCurrentDir;
  ConfigIni := TIniFile.Create(System.IOUtils.TPath.Combine(Path, 'Config.ini'));
//  ConfigIni := TIniFile.Create(System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 'Config.ini'));
//  ConfigIni := TIniFile.Create('C:\Users\leonard\Projects\LumberNowEMS\Server\Win32\Debug\config.ini');
  DBServerName := ConfigIni.ReadString(AppNode, 'ServerName', 'ZEUS');
  DBName := ConfigIni.ReadString(AppNode, 'DataBase', 'NOTHING');

//  showmessage(configini.FileName);


  with FDConnectionSTIKS.Params as TFDPhysMSSQLConnectionDefParams do
  begin
    DriverID := 'MSSQL';
    Server := DBServerName;
    Database := DBName;
    UserName := DBUserID;
    Password := DBPassword;
  end;

  ConfigIni.Free;

//  showmessage(Path + '; DBName:' +DBName);
//  Result := Format('DriverID=MSSQL;Server=%s;Database=%s;User_name=%s;Password=%s', [DBServerName, DBName, DBUserID, DBPassword]);
end;

我原以为IIS会从同一个位置读取ini文件,但事实并非如此。有人能告诉我应该把ini文件放在哪里,这样IIS就可以正确地访问它,或者是在Rad服务器中设置数据库连接的更好方法吗?如果有一个变量我可以访问,也许我可以把我的参数放在emsserver.ini中。

@nolaspeaker-我会相信你的回答,但你只发表了一条评论。您的回答促使我找到一种方法来确定正在使用的路径。因此,我将path变量的值写入了一个已知的文本文件

Path := GetCurrentDir;
AssignFile(F, 'C:\Temp\Data.txt');
Rewrite(F);
WriteLn(F, Path);
CloseFile(F);
正在使用的路径是“C:\Windows\SysWOW64\inetsrv”

我将我的Config.ini文件移动到此目录,找到并正确读取了它


感谢您的回复。

已经很晚了,仍然在发布答案

System.SysUtils中的函数在这里很有用

下面的函数调用将为您提供.bpl文件所在目录的路径

ExtractFilePath(GetModuleName(HInstance));

将ini与.bpl文件放在一起,将上述函数的结果与ini文件名相结合,将有助于确定ini的目标。

在IIS下运行时,
Path
变量的值是多少?这将立即回答您的问题。从“连接”面板转到根节点,双击ISAPI和CGI限制。从“操作”面板中选择“编辑要素设置”,并选中这两个选项,然后返回到根节点并双击处理程序映射。转到“操作”面板,选择“编辑功能权限”,然后选中“执行”。你能分享一下.ini文件的权限吗。在我的建议中,您需要给予IIS_iusr和iusr完全控制权。@nolaspeaker-我不知道如何确定运行IIS时PATH变量包含的内容。我无法使用showmessage(),并且我不确定当值包含在包中时如何显示它。运行EMSDevServer.exe时,路径变量为C:\inetpub\RADServer\EMSServer。我将查看是否可以将PATH变量的值写入文本文件。@JalpaPanchal我只加载了ISAPI扩展名,而没有加载CGI,并在根节点选中了“允许未指定的ISAPI模块”。我在RADServer节点上启用了执行权限,但在根节点上未启用。此后,我在根节点上启用了执行权限,结果没有任何变化。iUSR已具有完全权限。