【发布时间】:2014-03-14 16:29:26
【问题描述】:
我有一个 SQL CE 4.0 数据库,其中存储了一个(可能)大的签名 XML 字符串。目前,我将此字符串存储在ntext 类型的列中,因为nvarchar 有4000 字节的限制(请参阅this post)。
插入一行
所以要在这个表中插入一行,它看起来像这样:
string signedXmlObject = "....long string";
using (SqlCeCommand command = new SqlCeCommand("INSERT INTO SignedObjects (Key, SignedObject) VALUES(@key, @signedObject) ", connection))
{
command.CommandTimeout = 0;
command.CommandType = System.Data.CommandType.Text;
command.Parameters.AddWithValue("@key", theKey);
command.Parameters.AddWithValue("@signedObject", signedXmlObject);
rows = command.ExecuteNonQuery();
}
这适用于“小”字符串(小于 4000 字节),但对于大于该值的字符串,它将静默失败。命令执行不会抛出异常,但 SignedObject 列中会出现一个空字符串。
更改输入参数
所以,经过一番阅读,我发现要确保将string 正确插入为ntext 而不是解释为nvarchar,您必须像这样指定参数类型:
SqlCeParameter param = command.Parameters.Add("@signedObject", SqlDbType.NText);
param.Value = signedXmlObject;
这让我可以正确插入大字符串,从而解决问题。
签名验证
因此,我的程序将从数据库中读回这个字符串,用它填充一个 XML 文件,并尝试使用 .NET SignedXml 类来验证签名。问题是现在我的签名无法正确验证。
真正的问题
为什么会发生这种情况?我的 XML 文件是 UTF-8,所以这是存储字符串的格式。如果将其存储为 UTF-16,将其存储在 ntext 列中是否会稍微修改字符串?为什么 SQL 将输入解释为 nvarchar 以前允许签名验证成功?有没有更好的方法将这些数据存储在不会影响编码的数据库中?任何帮助将不胜感激!
【问题讨论】:
-
也许您应该将其作为字节流存储在“图像”列中?
-
@ErikEJ 这听起来是一个非常好的建议。我试试看。
-
@ErikEJ 您的建议非常有效。请将其发布为答案,以便我将其标记为已回答。
标签: c# utf-8 sql-server-ce signedxml