2016-02-25 2 views
0

Поскольку серверу требуется подключение для каждой базы данных, ответы, которые я нашел в SO, не работают вообще. Для некоторых таблиц мне нужно сделать некоторые вычисления перед копированием строк, но некоторые я могу скопировать всю таблицу. И, наконец, это автоматизация в моей программе, которую я написал.Копирование таблиц из одной базы данных в другую на том же сервере

Oldcn - это подключение к старой базе данных Newcn для новой базы данных.

Для таблиц, которые я могу скопировать целиком, я написал эту процедуру ниже.

Есть ли лучший короткий способ выполнить эту работу? (Работает на фоне)

private string[] CopyTva(MySqlConnection Oldcn, MySqlConnection Newcn, string[] res, DoWorkEventArgs we,string msg) 
    { 
     int counter = int.Parse(res[1]); 
     MySqlCommand cmd = new MySqlCommand("SELECT * FROM tvaval", Oldcn); 
     MySqlCommand cmd1 = new MySqlCommand("INSERT INTO tvaval (id,tvavalue,cr_user,cr_date,up_user,up_date) VALUES (@id,@tvavalue,@cr_user,@cr_date,@up_user,@up_date)", Newcn); 
     MySqlDataReader rd = null; 
     try 
     { 
      rd = cmd.ExecuteReader(); 
      while (rd.Read()) 
      { 
       cmd1.Parameters.AddWithValue("@id", rd["id"].ToString()); 
       //bla bla same as above 
       try 
       { 
        cmd1.ExecuteNonQuery(); 
       } 
       catch (MySqlException e) 
       { 
        rd.Dispose(); 
        res[2] = "Erreur:TVA " + e.Message.ToString(); 
        return res; 
       } 
       ++counter; 
       bgw.ReportProgress((counter * 100)/DbTotalRow,msg); 
       cmd1.Parameters.Clear(); 
      } 
      rd.Dispose(); 
     } 
     catch (MySqlException e) 
     { 
      res[2] = "Erreur:TVA " + e.Message.ToString(); 
      return res; 
     } 
     res[0] = "1";res[1] = counter.ToString();res[2] = ""; 
     return res; 
    } 
+0

когда вы выбрасывайте 2 оставшихся 'объектов MySqlCommand' .. попробуйте упаковку те вокруг' используя() {} ' – MethodMan

+0

У меня есть одно чтение и утилизация в цикле while и while. Поскольку соединения открыты во время всей передачи, я не использовал здесь инструкцию. Но я знаю, что это хорошее решение. Спасибо –

+0

Вы знаете, что автоматическое удаление не происходит на объектах sql. – MethodMan

ответ

0

MySQL не требует отдельного подключения для каждой базы данных. Соединение имеет базу данных по умолчанию, но вы можете указать имя базы данных явно перед именем таблицы, и это переопределит значение по умолчанию. Таким образом, вы можете сделать это с помощью одного запроса:

INSERT INTO newdb.tvaval 
SELECT * FROM olddb.tvaval 
+0

Как это настроить? используя (MySqlCommand cmd = new MySqlCommand («INSERT INTO» + NewDbName + «.» + TblName + «SELECT * FROM» + Pv.DbName + «.» + TblName, Oldcn)) Когда я пытаюсь выполнить этот запрос, я получаю this MySqlException: {MySql.Data.MySqlClient.MySqlException: команда INSERT запрещена для пользователя 'bodrum2015'@'XX.XXX.XX.XX' для таблицы 'def_firme' Поскольку я пытался вставить другую базу данных с не реализованным соединением. Если я делаю то же самое в localhost, это работает. –

+0

Вам необходимо предоставить разрешение 'INSERT' на' bodrum2015 @ x.x.x.x' в новой базе данных. – Barmar

+0

Используете ли вы разные подключения, потому что они имеют разные данные имени пользователя для каждой базы данных? – Barmar

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