我有一个 SQL CE 4.0 数据库,其中存储了一个(可能)大的签名 XML 字符串。目前,我将此字符串存储在类型的列中,ntext
因为有 4000 字节的限制nvarchar
(请参阅这篇文章)。
插入一行
所以要在这个表中插入一行,它看起来像这样:
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 列中会出现一个空字符串。
更改输入参数
因此,经过一番阅读,我发现要确保 astring
插入正确 asntext
而不是解释为nvarchar
,您必须指定参数类型,如下所示:
SqlCeParameter param = command.Parameters.Add("@signedObject", SqlDbType.NText);
param.Value = signedXmlObject;
这使我可以正确插入大字符串,从而解决了该问题。
签名验证
因此,我的程序将从数据库中读回这个字符串,用它填充一个 XML 文件,并尝试使用 .NETSignedXml
类验证签名。问题是现在我的签名无法正确验证。
真正的问题
为什么会发生这种情况?我的 XML 文件是 UTF-8,所以这是字符串应该存储的格式。ntext
如果将其存储为 UTF-16,将其存储在列中是否会稍微修改字符串?为什么 SQL 将输入解释为nvarchar
以前允许签名验证成功?有没有更好的方法将这些数据存储在不会影响编码的数据库中?任何帮助将不胜感激!