2012-02-15 45 views
0

我最近加入了一个团队,他们使用JSON序列化将参数数组传递给SQL Server存储过程,然后在这些存储过程中进行反序列化并提取所需的值,即每个存储过程都有一个@Parameters '类型VARCHAR(MAX)的参数。创建和执行命令的框架用C#编写,并使用标准.NET类型(SqlCommand,SQlParameter)等。JSON序列化和.NET SQL参数

看起来,当序列化内容的长度大于存储过程未正确执行,但没有例外。似乎没有发生。运行SQL事件探查器我发现没有尝试在SQL Server中执行存储过程。

例如: 在一种情况下,只有30个实例不超过8个属性被序列化。序列化成功并将值分配给SqlCommand的参数集合中的sql参数(只有一个参数)。该命令被执行但没有任何反应。如果某种类型的出现次数较少,则成功。当它不成功时,不会引发异常。

使用: SQL Server 2008 C#.NET 4.0 由Newtonsoft提供的JSON序列化。 代码中的SqlParameter被创建为varchar max。 客户端服务器架构 - 没有中间服务。

有谁知道JSON序列化值作为sql参数传递给SqlCommand的限制,或者有什么想法可能会导致这种行为?

+0

您能否提供样本@Parameters值? – 2012-02-15 09:20:20

+0

问题在于内容的长度,而不是正确形成的内容本身。我真的只是在询问是否有人在将Json序列化值作为sql参数传递时意识到了大小限制。 – Trev 2012-02-15 19:05:36

回答

0

我已经想通了我的情况发生了什么。它与sql参数中的值的序列化无关,因为我发现如果我等待了足够长的时间(在我的情况下为5-7分钟),程序最终执行了。

在存储过程中有一个游标被用来提取感兴趣的记录(这是批量更新过程)。这个游标正在调用CLR函数来为它需要的每个值反序列化Json。通过将desirialized数据插入临时表中以便在游标中使用,“问题”已解决。