使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016
Posted
技术标签:
【中文标题】使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016【英文标题】:Insert JSON into SQL Server 2016 using C# and OPENJSON 【发布时间】:2017-09-16 23:17:42 【问题描述】:我正在尝试使用 OPENJSON
将数据插入到我的数据库中,用 C# 编写代码。
我已成功插入所需的 JSON 对象,但我只能执行一次 - 这不是目标。我想用这种方式将多个 JSON 对象插入数据库并保留在那里。
我使用的 SQL 字符串是这样的:
@"SELECT BulkColumn INTO unparsed2 FROM OPENROWSET(BULK 'C:\\JSON\\data.json', SINGLE_CLOB) as j";
出于测试目的,代码只运行一次。如果我再次执行它,我会收到以下消息:
数据库中已经有一个名为“unparsed2”的对象。
我还尝试在 T-SQL 脚本中将对象作为参数传递,这会导致错误(但在第一个键值附近收到错误 - 可能是由于 json 对象中的分号)。
@"declare @json nvarchar (max) = " +json_object+ " "INSERT INTO unparsed SELECT * FROM OPENJSON(@json) AS json)";
“设备”附近的语法不正确。
我的 JSON 对象:
"device":"1234",
"status":1,
"level":100,
"dni":true,
"value":50
【问题讨论】:
【参考方案1】:创建表后,您不能再次创建它(SELECT ... INTO 将创建表)。请改用标准插入语法;
@"INSERT unparsed2 (BulkColumn) SELECT BulkColumn FROM OPENROWSET(BULK 'C:\\JSON\\data.json', SINGLE_CLOB) as j";
【讨论】:
没想到!谢谢,像魅力一样工作!跟进问:如果我已经有一个 JSON 对象(不在文件中),我如何在 T-SQL 中将它作为参数传递? ... (BULK 'json object' , SINGLE_CLOB) ... 当您说 JSON 对象时...您是指在 SQL 变量中吗?还是在您的 C# 代码中?如果 C# - 使用 SqlParameter,类似这样:csharp-station.com/Tutorial/AdoDotNet/Lesson06 在我的 C# 代码中。它是 Newtonsoft 包中的“JObject”。所以根据教程,我只需要声明参数,然后使用“ParameterName”将它添加到命令中。对吗? 我收到此错误:“不存在从对象类型 Newtonsoft.Json.Linq.JObject 到已知托管提供程序本机类型的映射。”cmd.Connection = conn; SqlParameter param = new SqlParameter(); param.ParameterName = "@json"; param.Value = o2; cmd.Parameters.Add(param); cmd.CommandText = @"INSERT unparsed2 (BulkColumn) SELECT BulkColumn FROM OPENROWSET(BULK '@json', SINGLE_CLOB) as j";
try conn.Open(); cmd.ExecuteNonQuery(); catch (SqlException e)
你可能需要做 o2.ToString() ??以上是关于使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016的主要内容,如果未能解决你的问题,请参考以下文章
如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?