从visual basic调用postgresql pg_dump.exe

时间:2013-08-26 07:39:24

标签: postgresql visual-studio-2012

我试图从我在visual basic(visual studio 2012)中创建的应用程序备份我的数据库

我将带有必要dll文件的pg_dump.exe复制到应用程序根目录。

测试pg_dump从cmd窗口进行备份并且运行正常

这是我用来尝试调用pg_dump exe的代码,但显然没有收到我想要发送的参数。

' New ProcessStartInfo created
    Dim p As New ProcessStartInfo
    Dim args As String = "-h serverip -p 5432 -U postgres db_name > " & txtPath.Text.ToString

    ' Specify the location of the binary
    p.FileName = "pg_dump.exe"

    ' Use these arguments for the process
    p.Arguments = args

    ' Use a hidden window
    p.WindowStyle = ProcessWindowStyle.Maximized

    ' Start the process
    Process.Start(p)

当进程开始时我得到这个消息:

pd_dump:命令行参数太多(首先是“>”) 请尝试“pg_dump --help”获取更多信息

如果我在cmd中键入此内容,则备份完成正常 pg_dump.exe -h serverip -p 5432 -U postgres db_name> C:\ db_bak.backup

但我不能让它从视觉上发挥作用。

1 个答案:

答案 0 :(得分:2)

首先,你的命令是完全错误的。您正在调用pg_dump,希望读取文件,因此您不想使用>。它会写入文件并在此过程中覆盖它。相反,您需要<,&#34;读取文件作为标准输入&#34;操作

但这不是导致错误的直接原因。 pg_dump无法理解><等。这些操作会指示shell(cmd.exe)执行I/O redirection。如果您未运行cmd.exe,那么他们就无法工作。要获得I / O重定向(>等),您需要通过cmd shell运行该过程,而不是直接调用它。

在这种情况下,use the -f filename option to pg_dump to tell it to write to a file代替标准输出可能更好。这样你就可以避免I / O重定向,不再需要shell了。它应该简单:

Dim args As String = "-h serverip -p 5432 -U postgres db_name -f " & txtPath.Text.ToString

或者,您可以使用cmd /C通过命令shell调用pg_dump。 Visual Basic可能提供了一种快捷方式来实现这一点;我没有使用它,因此我无法专门评论Visual Basic中进程调用的机制。检查CreateProcess docs; VB可能会使用CreateProcess。

我个人建议你这样做