首页 > 解决方案 > 插入 MySQL 时在数据库表上获取不正确的 BLOB 值

问题描述

让我快速介绍一下;我有 2 个服务器数据库服务器,我使用第二个数据库服务器来备份第一个数据库服务器的表。

问题是表有列存储 BLOB 值,不知道它存储的是什么类型的文件,所以我尝试使用字节数组将备份数据保存在第二个表中,并在需要时将这些数据恢复到第一个表。

这是我的工作方式,

首先,我从第一个表中选择数据并备份(插入)到第二个表

//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 数据及其长度 但是当我尝试使用类似的代码但更改插入表恢复到第一张表时。

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 的长度

我想知道我错过了什么?请给任何建议,谢谢。

我从中得到了这个想法,从 C# 中的 SQL 读取 BLOB 后转换为字节数组

我试过什么?

我通过 Visual Studio 2017 进行了调试,发现从 2nd 获取值仍然是正确的。 代码行和快速查看数据查询方法将数据插入第一个表

我认为当我获得像这个线程这样的数据时它可能正在转换,但它仍然没有解决我的问题。:(

标签: c#arraysblobmysqlconnection

解决方案


您在 --> 中使用了 {1} 而不是 {0}String.Format参数没有交给 INSERT 语句

这将是String.Format0 而不是 1 的权利。

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

推荐阅读