如何将输入数据发送到Postgres psql.exe?

时间:2016-05-20 07:47:18

标签: c# postgresql process

我想将用户MyUser的密码提供给psql.exe。不幸的是,我所有的尝请参阅以下代码:

        var psi = new ProcessStartInfo(@"c:\Program Files\PostgreSQL\9.5\bin\psql.exe", "-w -t -h localhost -p 5432 -U MyUser -c \"SHOW data_directory\"")
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            RedirectStandardError = true,
            CreateNoWindow = true

        };

        using (var process = new Process { StartInfo = psi })
        {
            process.OutputDataReceived += (sender, e) =>
            {
                Console.WriteLine($"Output: {e.Data}");
            };
            process.ErrorDataReceived += (sender, e) =>
            {
                Console.WriteLine($"Error: {e.Data}");
            };

            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.StandardInput.WriteLine("Password");
            process.StandardInput.Flush();


            process.WaitForExit();
            Console.WriteLine($"Exit code: {process.ExitCode}");
        }

psql.exe永远不会从重定向的标准输入中读取密码。因此,进程在WaitForExit上挂起。如果我使用CreateNoWindow = false而不是我能够将密码写入控制台窗口并在OutputDataReceived,ErrorDataReceived中接收答案,但这不是我需要的。我需要在没有用户交互的情况下运行psql.exe。请注意,密码不应存储在pgpass.conf中。

2 个答案:

答案 0 :(得分:3)

基本上,它是一种安全措施,psql不会从非终端输入源获取密码。

使用任何具有良好库的编程语言(例如C#/ .NET)对postgreSQL数据库执行某些操作的正确的方法是简单地使用客户端库连接到数据库而不是打电话给外部过程。

答案 1 :(得分:2)

试一试:

proc.StartInfo.EnvironmentVariables["PGPASSWORD"] = "mypass";

它对我有用。