2015-10-08 2 views
-3

У меня возникла ошибка, когда я использовал (MySqlBackup). Я уже добавил MySqlBackup.dll к своей ссылке, но у меня все еще была та же ошибка. Кто-нибудь знает, как это исправить ?Должно быть неявно конвертируется в System.IDisposable

Вот код:

public bool createBackup() 
    { 
     bool ret = false; 
     using (var sfd = new SaveFileDialog()) 
     { 
      sfd.Filter = "SQL Backup File (*.sql)|*.sql"; 
      sfd.FilterIndex = 1; 
      sfd.FileName = "MyBackup.sql"; 

      if (sfd.ShowDialog() == DialogResult.OK && sfd.FileName.Length > 0) 
      { 
       string file = sfd.FileName; 

       using (MySqlConnection con = new MySqlConnection(connect())) 
       { 
        using (MySqlCommand cmd = new MySqlCommand()) 
        { 
         using (MySqlBackup mb = new MySqlBackup(cmd)) 
         { 
          try 
          { 
           cmd.Connection = con; 
           con.Open(); 
           mb.ExportToFile(file); 
           con.Close(); 
           ret = true; 
          } 
          catch (Exception ex) 
          { 
           MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
          } 
         } 
        } 
       } 
      } 
     } 
     return ret; 
    } 
+1

Так в чем же ошибка? – Dealdiane

+0

какая строка выводит код при использовании отладчика и точек останова ..? какая именно ошибка. У вас есть следующие ссылки, добавленные в ваш проект 'Пространство имен: Система' в вашем разделе использования в верхней части файла cs || 'Assembly: mscorlib (in mscorlib.dll)' [Интерфейс IDDN для MSDN] (https://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx) – MethodMan

+0

Когда Я вставляю ваш код в новое консольное приложение и добавляю MySqlBackup.NET NuGet pacakge, программа компилируется без ошибок. –

ответ

0

using распоряжаться сам экземпляр сразу же после его сфера заканчивается. Для этого класс должен реализовать интерфейс System.IDisposable.

Если это не так, вы не можете использовать его в using, а не Dispose() его вручную. Вам нужно будет создать свой экземпляр, и пусть GarbageCollector сделает это за вас.

Итак, у вас есть 2 варианта:

  • Просто реализовать System.IDisposable на классе
  • Не использовать using

С помощью:

//inherit from "IDisposable" 
class SystemResource : IDisposable 
{ 
    //add Dispose method 
    public void Dispose() 
    { 
    } 
} 

Без использования:

MySqlBackup mb = new MySqlBackup(cmd); 
try 
{ 
    cmd.Connection = con; 
    con.Open(); 
    mb.ExportToFile(file); 
    con.Close(); 
    ret = true; 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
} 
0

Поскольку вы используете «using(//your class){}» он должен реализовать IDisposable, то только он может поддержать using(){} block. check this ссылка для правильного использования этого оператора.

0

Вы не можете использовать MySqlBackup() с блочным кодированием, вы используете только соединение и команду в этом формате (блок), но для этого вам придется создать свой экземпляр и утилизировать его вручную.

Смежные вопросы