在 process.start 上使用 mysqldump 没有任何反应,但是当我在 cmd 上尝试参数时它正在工作

using mysqldump on process.start nothing happens, but when I try the argument on cmd it is working

我花了好几个小时解决这个问题。我有这个代码

    Dim drive_name As String = Directory.GetCurrentDirectory & "\database"

    Dim db_name As String = "sample_db.sql"

    Dim argument As String = "-u root sample_db table1 > """ & drive_name & "\" & db_name & """"
    Try
        Diagnostics.Process.Start("C:\xampp\mysql\bin\mysqldump.exe", argument)
        Console.WriteLine("Argument:  " & argument)
    Catch ex As Exception
        Console.WriteLine("Error:   " & ex.ToString)
    End Try

通过查看console.writeline,它输出如下

-u root sample_db table1 > "C:\Users\MyName\Desktop\MyProjectPath\bin\Debug\database\sample_db.sql"

但是通过检查C:\Users\MyName\Desktop\MyProjectPath\bin\Debug\database\我看不到sample_db.sql,所以我打开mysqdump复制console.writeline并粘贴到cmd。我现在在 mysqldump

上有这个
C:\Users\MyName>C:\xampp\mysql\bin\mysqldump -u root sample_db table1 > "C:\Users\MyName\Desktop\MyProjectPath\bin\Debug\database\sample_db.sql"

通过在 mysqldump 上执行它可以工作。

我该如何解决这个问题?

In this link 一位用户建议将 > 更改为 -r

所以不用

Dim argument As String = "-u root sample_db table1 > """ & drive_name & "\" & db_name & """"

您现在将拥有

 Dim argument As String = "-u root sample_db table1 -r """ & drive_name & "\" & db_name & """"

它将工作

虽然这不使用 mysql(因为我没有),但原则适用。

Process p = new Process();
p.StartInfo.FileName = @"c:\windows\system32\ipconfig.exe";
p.StartInfo.Arguments = @"/all";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
String output = p.StandardOutput.ReadToEnd();
File.WriteAllText(@"c:\log.txt",output);
p.WaitForExit();

在 log.txt 中是我预期的输出。

所以在你的情况下,你在文件名中有转储命令,在参数中有参数,并将 writealltext 更改为你的输出文件

显然,如果您愿意,您可以使用它来发挥更大的创意,例如大小可能是个问题,毕竟如果您有 GB 的数据,将其全部存储在一个字符串中可能要求有点高,但是输出是一个流,所以实际上你可以进一步工作并更直接地使用流并逐块输出

根据 的建议,我现在可以使用 standardInput 和 standardOutput`

导入代码:

    Try
        Dim myProcess As New Diagnostics.Process()
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.WorkingDirectory = "C:\xampp\mysql\bin\"
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.Start()
        Dim myStreamWriter As StreamWriter = myProcess.StandardInput
        Dim mystreamreader As StreamReader = myProcess.StandardOutput
        createDatabase()
        myStreamWriter.WriteLine("mysql -u  root  sample_db < " & drive_name & "\" & db_name)
        myStreamWriter.Close()
        myProcess.WaitForExit()
        myProcess.Close()
    Catch ex As Exception
        Console.WriteLine("Error on Import: " & ex.ToString)
    End Try

如果你想将其更改为导入,只需将这行代码更改为你想要的 mysqldump 导出命令:

myStreamWriter.WriteLine("mysql -u  root  sample_db < " & drive_name & "\" & db_name)

导出命令示例

myStreamWriter.WriteLine("mysql -u  root  sample_db > " & drive_name & "\" & db_name)