Получите неправильное значение BLOB для таблицы базы данных при вставке в MySQL - PullRequest
0 голосов
/ 05 июля 2019

Давайте я сделаю краткое введение; У меня есть 2 сервера базы данных, на которых я использовал второй сервер БД для резервного копирования одной из таблиц первого сервера БД.

Проблема в том, что в таблице есть столбец, в котором хранится значение BLOB, не знаю, в каком именно файле она хранится, поэтому я попытался использовать байтовый массив, чтобы сохранить данные резервной копии во 2-й таблице и восстановить эти данные в 1-й таблице, когда она необходимо.

Вот как я работал,

Сначала я выбираю данные из 1-й таблицы и резервное копирование (вставка) во 2-ю таблицу

//inserting byte[] to 2nd db
String tmpBatchInsert = String.Format(@"INSERT INTO 2nd_table (VERSION, PRODUCTID, ROUTE) VALUES ('{0}',{1},@route);", version, tmpInsertValue);
MySqlConnection connMySQL2 = new MySqlConnection(connString);
MySqlCommand cmdMySQL2 = new MySqlCommand(tmpBatchInsert, connMySQL2);
cmdMySQL2.Parameters.AddWithValue("@route", routeByte);
connMySQL2.Open();
try
{
    cmdMySQL2.ExecuteNonQuery();
}
catch
{
    MessageBox.Show("Found data duplicate in an active database, skip saving..", "Data duplicate!");
}
connMySQL2.Close();

Работает отлично (я проверил, посмотрев на сохраненное значение длины ROUTE, значение BLOB) img: данные BLOB-объектов и их длина во 2-й таблице Но когда я попытался восстановить таблицу 1rt, используя аналогичный код, но изменив таблицу вставки.

String tmpBatchInsert = String.Format(@"INSERT INTO 1st_table (PRODUCTID, ROUTE) VALUES ({0},@route);", tmpInsertValue);
MySqlConnection connMySQL2 = new MySqlConnection(connString2);
MySqlCommand cmdMySQL2 = new MySqlCommand(tmpBatchInsert, connMySQL2);
cmdMySQL2.Parameters.Add("@route", MySqlDbType.Blob).Value = routeByte;
connMySQL2.Open();
cmdMySQL2.ExecuteNonQuery();
//MessageBox.Show("Found data duplicate in active database, skip saving..", "Data duplicate!");
connMySQL2.Close();

В нем хранится неправильное значение Blob. img2: длина BLOB-объекта на 1-м столе

Интересно, что я пропустил? Пожалуйста, на любое предложение, спасибо.

Я получил эту идею от this и Преобразования в байтовый массив после чтения BLOB из SQL в C #

Что я пробовал?

Я был отлажен с помощью Visual Studio 2017 и обнаружил, что значение get из 2nd все еще верно. строка кода и быстрый просмотр данных для метода запроса для вставки данных в 1-ю таблицу

Я думал, что это может быть приведение, когда я получаю данные, подобные thread , но это все еще не решило мою проблему (

1 Ответ

0 голосов
/ 05 июля 2019

Вы использовали {1} вместо {0} в String.Format -> Параметр не передан в оператор INSERT

Это было бы правильным String.Format с 0 вместо 1.

String.Format(@"INSERT INTO 1st_table (PRODUCTID, ROUTE) VALUES ({0},@route);", tmpInsertValue);
...