我正在尝试编写一个数据迁移应用程序。有几十个表,其中有很多列。
我无法将数据从数据表导入SQL Server表。
尝试使用SqlBulkCopy
时出现错误:
来自数据源的String类型的给定值无法转换为指定目标列的类型图像。
我已经构建了一个生成相同错误的测试。
在测试数据库中创建表。
CREATE TABLE [dbo].[CALTEST]
(
[ACCOUNTNO] [VARCHAR](20) NULL,
[NOTES] [IMAGE] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
将代码粘贴到按钮单击事件中
private void button3_Click(object sender, EventArgs e)
{
//Convert json to Datatable
//bulkcopy datatable into CALTEST
string json =
@"[{
""ACCOUNTNO"": ""B1082380914D!J5_8BAR"",
""NOTES"": ""WyBDViBTZW50IF0NCkNhbmRpZGF0ZSA6IEFsYmVydCBHYXZpbnMNCkRlc2NyaXB0aW9uIDoNCg0KDQo=""
},
{
""ACCOUNTNO"": ""B1082380914D!J5_8BAR"",
""NOTES"": ""WyBJbnRlcnZpZXcgXQ0KQ2FuZGlkYXRlIDogQWxiZXJ0IEdhdmlucw0KRGVzY3JpcHRpb24gOg0KDQoNCg==""
},
{
""ACCOUNTNO"": ""B1090241471P!-R0?ELI"",
""NOTES"": ""WyBDViBTZW50IF0NCkNhbmRpZGF0ZSA6IEFsYmVydCBHYXZpbnMNCkRlc2NyaXB0aW9uIDoNCg0KDQo=""
}]
";
string connectionString = string.Format($"Server=SERVERNAME;Database=TEST;Trusted_Connection=True;");
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
DataTable dt = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT TOP 0 * FROM CALTEST", conn))
{
adapter.Fill(dt);
};
DataTable dtJson = JsonConvert.DeserializeObject<DataTable>(json, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
});
//foreach (DataRow dr in dtJson.Rows)
//{
// dt.Rows.Add(dr.ItemArray);
//}
using (var bulkCopy = new SqlBulkCopy(conn))
{
// dt.Columns.Cast<DataColumn>().ToList().ForEach(x => bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(x.ColumnName, x.ColumnName)));
bulkCopy.DestinationTableName = "CALTEST";
bulkCopy.BatchSize = 50000;
bulkCopy.BulkCopyTimeout = 60; //seconds
bulkCopy.WriteToServer(dt);
}
}
}
我正在从数据库中检索表数据结构,该结构有效。 NOTES列的类型为image
。
但是当添加json数据表时,该数据模式将被覆盖。
我该如何设置从json检索到的字段的数据类型?
我应该放弃SqlBulkCopy
并为每条记录生成插入查询吗?
将json数据放入SQL Server表的最佳方法是什么?
谢谢。