如何使用C#中的mysql.exe

时间:2011-02-08 18:25:30

标签: c# mysql cmd

我需要从C#代码中调用以下命令: mysql.exe --user = useranme --password = password --database = base< C:\备份\ data.sql

我用:

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.FileName = "mysql.exe";
process.StartInfo.Arguments = "--user=useranme --password=password --database=base < C:\backups\data.sql";

process.OutputDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs args)
{
    Console.WriteLine(args.Data);
});

process.Start();
process.BeginOutputReadLine();

process.WaitForExit();

但它不能直接进入命令行。我看到没有执行正确的部分“&lt; C:\ backups \ data.sql”。

请帮助。

3 个答案:

答案 0 :(得分:5)

这是因为写作&lt;命令提示符下的filename强制shell在程序的标准输入中提交文件c:\ backups \ data.sql的内容。在'&lt;'之后传递部分在参数中是不正确的,因为你必须提供你的可执行文件的stdin与文件的内容。为了进行stdin / stdout重定向,你可以参考这个问题:

Redirecting stdin and stdout where stdin closes first

您将data.sql文件的内容推送到stdin流。

答案 1 :(得分:2)

我注意到的一件事,是不是你的数据库不是data.sql,而是其他方式,第一个字母与escape sequence匹配?

您需要转义路径中的所有\个字符,否则C#编译器会将它们视为转义序列 在您的代码中,"C:\backups"实际上变为C:□ackups 您需要使用@前缀字符串,告知编译器不使用转义序列,或者使用另一个\前缀\

process.StartInfo.Arguments = @"--user=useranme --password=password --database=base < C:\backups\data.sql";

process.StartInfo.Arguments = "--user=useranme --password=password --database=base < C:\\backups\\data.sql";

然而,你可能只是在这里输入了一些路径而你的代码没有这个错误。

答案 2 :(得分:1)

请参阅SchlaWiener的答案:

Problem, executing commands in cmd using c#

它对我有用! :)