Резервное копирование базы данных в MySQL с помощью C#

Я создал Winforms для резервного копирования моей базы данных. Затем, когда я запускаю свою программу, она дает исключение Win32Exception. "Система не может найти указанный файл", хотя файл уже существует и привел к этому исключению.

вот мой код относительно моей проблемы

using System.Diagnostics;

private void btnProceed_Click(object sender, EventArgs e)
{
            path = @"D:MySQLMySQL Server 5.5binmysqldump.exe -u " + txtBoxDBUsername.Text + @" -p " + txtBoxDBName.Text + @" > D:C#ClientSalesmate - EMCSalesMateBackup" + maskeTxtBoxDBFile.Text + @"";
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
}

6 ответов


Вы можете использовать MySqlBackup.NET как альтернатива MySqlDump
Documentation:
http://www.codeproject.com/Articles/256466/MySqlBackup-NET-MySQL-Backup-Solution-for-Csharp-V
https://github.com/MySqlBackupNET/MySqlBackup.Net

Пример кода:

резервное копирование базы данных MySQL

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();
            }
        }
    }
}

обновление:
Я один из авторов этой библиотеки.


Я попробовал этот код, но проблема возникает перед запуском. exeption is-необработанное исключение типа ' System.ИО.FileLoadException ' произошло в системе.Окна.Формы.dll файлы

дополнительная информация: не удалось загрузить файл или сборку MySql.Данные, версия=6.5.4.0, культура=нейтральная, PublicKeyToken=c5687fc88969c44d' или одна из его зависимостей. Определение манифеста сборки расположены не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)


Я считаю, что вы должны упомянуть пользователя, pwd, имя БД и целевой путь..

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] [имя_базы_данных]

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


  • не помещайте весь вызов внутри " path =", вы должны использовать" аргументы", чтобы указать аргументы, как говорит name. Если библиотека проверяет наличие вызываемого файла (весь ваш путь), она не должна его найти!
  • вы уверены, что путь правильный? Вы должны найти MySQL Server path с помощью реестра, а не жесткого кодирования пути, или если это может быть нелегко для вас, вы можете передать его в качестве аргумента из командной строки или указать из своей формы (страница настроек).
  • вы можете иметь пропущенные учетные данные:- u должен использоваться для имени пользователя (даже если я использую --user) и-p должен быть для пароля (даже если я использую --password). Почему вы передаете " txtBoxDBимя.Текст" как пароль?!
  • возможно, ваш путь назначения недействителен: он содержит пробелы, если вы используете пробелы, вы должны использовать кавычки.
  • что делает txtBoxDBName.Текст (?пароль?) содержит? Пространства тоже? Если да, то это не работает.
  • последнее присутствие + @"" совершенно бесполезно, это не вставить любые кавычки.

правильная версия вашего кода с исправленными кавычками: 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}<{4}", "root", "password", "localhost", "your_dbname", "your_.sql_file");
psi.UseShellExecute = false;
Process process = Process.Start(psi);
process.StandardInput.WriteLine(input);
process.StandardInput.Close();
process.WaitForExit();
process.Close();

это сработало для меня, вы можете попробовать, пока у вас есть резервная копия .sql-файл


вы можете попробовать это.

    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;
                    }



                }

            }

        }

    }