将JSON中的数据获取到SQL Server数据表中

时间:2018-11-29 00:45:42

标签: c# json sql-server sqlbulkcopy

我正在尝试编写一个数据迁移应用程序。有几十个表,其中有很多列。

我无法将数据从数据表导入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表的最佳方法是什么?

谢谢。

0 个答案:

没有答案