我目前正在研究C#。该项目的一部分涉及将SQL文件中的管道连接到MySQL程序中以将文件恢复到数据库中。
以下是我正在使用的代码。
command = string.Format("--host={0} --user={1} --password={2} --port={3} {4} < {5}",
MySQLConnectionManager.currentlyUsingConnection[MySQLConnectionManager.ConnectionKeyStrings.SERVER],
MySQLConnectionManager.currentlyUsingConnection[MySQLConnectionManager.ConnectionKeyStrings.USERNAME],
MySQLConnectionManager.currentlyUsingConnection[MySQLConnectionManager.ConnectionKeyStrings.PASSWORD],
MySQLConnectionManager.currentlyUsingConnection[MySQLConnectionManager.ConnectionKeyStrings.PORT],
db.database, restoreFile);
Process process = new Process();
process.StartInfo.UseShellExecute = false;
//process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.FileName = @"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe";
process.StartInfo.Arguments = command;
process.StartInfo.CreateNoWindow = true;
process.Start();
//string output = process.StandardOutput.ReadToEnd();
string errorOutput = process.StandardError.ReadToEnd();
我没有遇到任何错误,如果我重定向标准输出,我只是返回文件的内容而不是实际执行恢复。
感谢您提供的任何帮助。
答案 0 :(得分:4)
在shell中,<
将给定文件的内容传递到命令的标准输入中。但是,由于您设置了process.StartInfo.UseShellExecute = false;
,这意味着该命令不会被解释为shell脚本,并且所有输入/输出重定向都必须通过.NET接口完成。
您需要将文件内容写入process.StandardInput
。不幸的是,process.StandardInput
是一个StreamWriter,我知道没有简单的方法可以将文件内容复制到StreamWriter中。也许在文件的FileStream上使用CopyToAsync并将其发送到StandardInput.BaseStream可能会有效。
现在,您需要UseShellExecute = false
才能使RedirectStandardError = true
生效。另一种方法是在命令行中将StdErr重定向到StdOut,并设置UseShellExecute = false
。您可以通过将格式字符串更改为:
"--host={0} --user={1} --password={2} --port={3} {4} < {5} 2>&1"
但是,这可能会产生其他副作用,例如要求用户名运行。
免责声明:我实际上没有测试过这些解决方案。它们可能有效也可能无效。
答案 1 :(得分:1)
我是一名Linux程序员,但从我的角度来看,你正在将文件名传递给mysql。如果是这样,这是不对的。你应该把sql文件的内容传递给mysql
答案 2 :(得分:0)
我对python和mysql比较熟悉,但我要做的就是打开文件并将其读取,好像它是一个文本文件,删除任何行尾字符并创建一个可以在服务器上执行的sql命令将数据还原回服务器。我不太了解c#所以我不能写一个例子。希望这会有所帮助。