delphi - 查找 psql 命令验证用户是否失败

标签 delphi postgresql psql

使用德尔福 怎么才能查出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 ( so it ran successfully ) 但对我来说密码验证失败了.. 如果密码失败,有什么方法可以通过delphi查找脚本是否失败? 由于 pgpass.conf 可能尚未创建,因此我无法检查文件中的用户密码。 用户可能不知道密码或输入了错误的密码。

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

注意:Postgresql 9.0

最佳答案

the returned value was over 32 (so it ran successfully)

不,这不是这个意思。 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 编程 - 你真的需要它吗?

关于delphi - 查找 psql 命令验证用户是否失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12363628/

相关文章:

windows - 在 Windows 上的 R 中执行 PSQL

Delphi - TStringList 保存/加载到流编码

Delphi:在 Form Create 上创建并显示图像

c++ - 在 C++ 代码中处理 PL/pgSQL 函数的消息

postgresql - 2.3.x Java 中 Play Framework 中 JPA 的模型父类(super class)

linux - 如何使用 .pgpass 文件中给出的密码连接到 postgres?

json - 如何在 XE4 中使用 TFDJSONDataSets 或类似的?

delphi - 如何在注册表中为COM服务器的多个版本进行配置?

sql - 聚合不提供我期望的信息并按重复记录分组

windows - 无法在 Windows 10 上更改 psql 中的目录。PostgreSQL 11