2

使用Delphi 如何找出psql脚本已经返回

   password authentication has failed for user "myadmin"

运行以下脚本时(psqlRun.bat)

   "C:\Program Files\PostgreSQL\9.0\bin\psql.exe"  -h localhost -p 5433 -d TestDB -U myadmin -f someSQLscript.sql   

上面的脚本是使用 shellexecute 运行的

   ReturnedValue:= ShellExecute(Handle,'open',PChar('C:\psqlRun.bat'), nil, nil, SW_SHOWNORMAL);

返回的值超过 32(所以它运行成功)但对我来说密码验证失败.. 有没有办法通过 delphi 找到如果密码失败,脚本是否失败?由于pgpass.conf可能尚未创建,因此我无法检查文件中的用户密码。用户可能不知道密码或输入了错误的密码。

那么以编程方式如何检查身份验证是否失败?

注意:Postgresql 9.0

4

1 回答 1

3

返回值超过 32(所以运行成功)

不,不是这个意思。http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153.aspx 这仅意味着它已成功启动。如果完整运行成功与否,MSDN 提示无法知道使用 ShellExecute/ShellExecuteEx。

您应该使用 CreateProcess 来获取正在运行的任务句柄,然后使用 WaitFor 来获取结果或拦截它的输出以查找特定的行。

您可以尝试 Jedi Code Library,其中 JclSysUtils 单元具有 Execute 功能和 TJclCommandLineTool 类来封装它。使用示例是 JCL 安装程序,它调用许多命令行实用程序,如 DCC32.EXE,捕获并将其输出保存到日志并检查返回码。

PS。而且你最好不要使用bat文件。制作命令行并直接运行。现在你把它变成一棵树。

 YourProg.exe
 \\-> CMD.EXE /C BAT-FILE-NAME
      \\->pgSQL exe with options

即使 pgSQL.exe 返回一些东西,它也不会返回到您的程序,而是返回到 CMD.exe
之后 CMD.exe 将该代码公开到其内部变量 %ERRORLEVEL%
现在您必须了解它是否可以将该变量传递给您的外部程序。

为什么 ?每个下一个间接级别都会使您的程序更加孤立和脆弱。不用脚本直接调用PG EXE即可。否则你也应该为 CMD.EXE 编程——你真的需要它吗?

于 2012-09-11T06:27:14.510 回答