繁体   English   中英

使用 C# 在 MySQL 中备份数据库

[英]Backing up Database in MySQL using C#

我创建了一个 Winforms 来备份我的数据库。 然后当我运行我的程序时,它给出了一个未处理的 Win32Exception。 “系统找不到指定的文件”尽管该文件已存在并导致该异常。

这是我关于我的问题的代码

using System.Diagnostics;

private void btnProceed_Click(object sender, EventArgs e)
{
            path = @"D:\MySQL\MySQL Server 5.5\bin\mysqldump.exe -u " + txtBoxDBUsername.Text + @" -p " + txtBoxDBName.Text + @" > D:\C#\Client\Salesmate - EMC\SalesMate\Backup\" + maskeTxtBoxDBFile.Text + @"";
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
}

您可以使用MySqlBackup.NET作为替代的mysqldump
文档:
http://www.codeproject.com/Articles/256466/MySqlBackup-NET-MySQL-Backup-Solution-for-Csharp-V
https://github.com/MySqlBackupNET/MySqlBackup.Net

示例代码:

备份 MySQL 数据库

using MySql.Data.MySqlClient; 

然后是代码

private void Backup()
{
    string constring = "server=localhost;user=root;pwd=qwerty;database=test;";
    string file = "C:\\backup.sql";
    using (MySqlConnection conn = new MySqlConnection(constring))
    {
        using (MySqlCommand cmd = new MySqlCommand())
        {
            using (MySqlBackup mb = new MySqlBackup(cmd))
            {
                cmd.Connection = conn;
                conn.Open();
                mb.ExportToFile(file);
                conn.Close();
            }
        }
    }
}


还原 MySQL 数据库

private void Restore()
{
    string constring = "server=localhost;user=root;pwd=qwerty;database=test;";
    string file = "C:\\backup.sql";
    using (MySqlConnection conn = new MySqlConnection(constring))
    {
        using (MySqlCommand cmd = new MySqlCommand())
        {
            using (MySqlBackup mb = new MySqlBackup(cmd))
            {
                cmd.Connection = conn;
                conn.Open();
                mb.ImportFromFile(file);
                conn.Close();
            }
        }
    }
}

更新:
我是这个库的作者之一。

我已经尝试过该代码,但在运行前出现问题。 例外是 - System.Windows.Forms.dll 中发生类型为“System.IO.FileLoadException”的未处理异常

附加信息:无法加载文件或程序集“MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或其依赖项之一。 定位的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040)

我相信您必须提到用户,密码,数据库名称和目标路径..

string path = @"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqldump.exe -u " + txtBoxDBUsername.Text + @" -p " + txtBoxDBName.Text + @" > " + txtBoxDBName.Text + @".sql"; 

备份:#mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql

恢复:# mysql -u root -p[root_password] [database_name] < dumpfilename.sql

http://www.thegeekstuff.com/2008/09/backup-and-restore-mysql-database-using-mysqldump/

你可以试试这个。

    public void BackUpData(string file)
    {
        using (MySqlConnection con = new MySqlConnection { ConnectionString = config })
        {
            using (MySqlCommand cmd = new MySqlCommand { Connection = con })
            {
                using (MySqlBackup mb = new MySqlBackup { Command = cmd })
                {


                    try
                    {
                        con.Open();

                        try
                        {
                            mb.ExportToFile(file);
                        }
                        catch(MySqlException ex)
                        {
                            msgErr(ex.Message + " sql query error.");
                            return;
                        }
                    }
                    catch(MySqlException ex)
                    {
                        msgErr(ex.Message + " connection error.");
                        return;
                    }



                }

            }

        }

    }
  • 不要把整个调用放在“path =”中,你应该使用“Arguments”来指定参数,正如名称所说。 如果库检查被调用文件(您的整个路径)的存在,它不应该找到它!
  • 你确定这条路是正确的吗? 您应该使用注册表找到 MySQL 服务器路径,而不是对路径进行硬编码,或者如果对您来说不容易,您可以将它作为参数从命令行传递或从您的表单(设置页面)中指定。
  • 您可能遗漏了凭据:-u 应该用于用户名(即使我使用 --user),-p 应该用于密码(即使我使用 --password)。 为什么要传递“txtBoxDB Name .Text”作为密码?!
  • 也许您的目标路径无效:它包含空格,如果您使用空格,则应使用引号。
  • txtBoxDBName.Text (?password?) 包含什么? 还有空格? 如果是,它不起作用。
  • 最后出现的+ @""完全没用,它不插入任何引号。

更正引号的正确代码版本是: path = @"""D:\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe"" -u " + txtBoxDBUsername.Text + @" -p " + txtBoxDBName.Text + @" > ""D:\\C#\\Client\\Salesmate - EMC\\SalesMate\\Backup\\" + maskeTxtBoxDBFile.Text + @"""";

为了提高可读性: path = $@"""D:\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe"" -u {txtBoxDBUsername.Text} -p {txtBoxDBName.Text} > ""D:\\C#\\Client\\Salesmate - EMC\\SalesMate\\Backup{maskeTxtBoxDBFile.Text}""";

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\xampp\mysql\bin\mysql.exe";
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = false;
psi.CreateNoWindow = true;
psi.Arguments = string.Format(@"-u{0} -p{1} -h{2} {3}", "root", "password", "localhost", "your_dbname");
psi.UseShellExecute = false;
Process process = Process.Start(psi);
process.StandardInput.Write(File.ReadAllText(inputFilePath));
process.StandardInput.Close();
process.WaitForExit();
process.Close();

这个对我有用,只要您备份了 .sql 文件就可以尝试一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM