通过C#恢复MySQL文件

xeufq47z  于 2023-04-19  发布在  Mysql
关注(0)|答案(3)|浏览(131)

我目前正在编写一个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();

我没有得到任何错误,但如果我重定向标准输出,我只是得到返回的文件的内容,而不是实际执行恢复。

92dk7w1h

92dk7w1h1#

在shell中,<将给定文件的内容通过管道传输到命令的标准输入中。然而,由于您设置了process.StartInfo.UseShellExecute = false;,这意味着命令不会像shell脚本那样被解释,并且所有输入/输出重定向都必须通过.NET接口完成。

选项一:使用.NET界面

您需要将文件的内容写入process.StandardInput。不幸的是,process.StandardInput是一个StreamWriter,我不知道有什么简单的方法可以将文件的内容复制到StreamWriter中。也许在文件的FileStream上使用CopyToAsync并将其发送到StandardInput.BaseStream可以工作。

选项二:使用Shell接口

现在,您需要有UseShellExecute = false才能使RedirectStandardError = true生效。另一种方法是在命令行中将StdErr重定向到StdOut,并设置UseShellExecute = false。您可以通过将格式字符串更改为:

"--host={0} --user={1} --password={2} --port={3} {4} < {5} 2>&1"

但是,这可能会产生其他副作用,例如需要用户名才能运行。

  • 免责声明:我没有实际测试过这两种解决方案,它们可能有效,也可能无效。*
70gysomp

70gysomp2#

我是一个linux程序员,但是从我的Angular 来看,你是把文件名通过管道传输到mysql,如果是这样,这是不对的,你应该把sql文件的内容通过管道传输到mysql

hkmswyz6

hkmswyz63#

我更熟悉python和mysql,但我会打开文件并读取它,就像它是一个文本文件一样,去掉任何行尾字符,并创建一个可以在服务器上执行的sql命令,以将数据还原到服务器。我不太了解c#,所以我不能写一个例子。希望这对你有帮助。

相关问题