<分区>
我们有一个非常大的List<object>
我们正在将其转换为 json 字符串,然后发送到存储过程。为了让这篇文章简单明了,假设对象看起来像这样:
public class Customer
{
public string Name { get; set; }
}
其中一位客户是“Bob's Repair Shop”。当其中包含此值的列表被序列化时,它将包含以下内容:
{
"Name": "Bob's Repair Shop"
}
没关系,直到我们要将此 json 发送到存储过程为止。当它到达那里时,单引号会引发错误(我理解)。
最初我们通过执行 .replace("'", "~")
来处理这个问题在 C# 代码中的 json 字符串上,然后在存储过程中执行相反的操作。这工作了一段时间。但是我们现在遇到的是我们拥有 List<> 的对象比这个小例子复杂得多,而且我们还要处理列表中的数十万条记录。当 json 字符串这么大时,.replace("'", "~")
抛出 Out of Range
异常(exception)。老实说,这 .replace("'", "~")
无论如何,这种方法都是一种技巧。
我希望找到一种方法来序列化我们的 List<object>
以在序列化过程中转义单引号的方式。这可能吗?如果是这样,怎么做到的?
编辑:
我本来就应该这么说的。对不起,我错过了。以下是存储过程如何接收 json 字符串:
ALTER PROCEDURE [dbo].[name_of_proc]
@jsonString NVARCHAR(MAX)
AS
然后我们转换 @jsonString
到表变量 OPENJSON
编辑 2:
如何调用 sp:
public void UpdateBulk(List<object> myObject)
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(myObject);
json.replace("'", "~");
var dParam = new DynamicParameters();
dParam.Add("@jsonString", json);
QuerySP<myObject>("name_of_proc", dParam);
}
protected IEnumerable<T> QuerySP<T>(string storedProcedure, object param = null)
{
using (var db = this.Context)
{
var output = db.Query<T>(storedProcedure, param: param, commandType: CommandType.StoredProcedure,commandTimeout: 32767);
return output;
}
}
编辑 3: 指向可能重复的线程询问如何更改它:
{"key" : "value"}
为此:
{'key' : 'value'}
这不是我要问的。我在问如何改变这个:
{
"Name": "Bob's Repair Shop"
}
对此:
{
"Name": "Bob\'s Repair Shop"
}