Delphi 为RAD服务器动态设置数据库参数
我开发了一个通过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文件的代码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
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已具有完全权限。