1

我有一个 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以前允许签名验证成功?有没有更好的方法将这些数据存储在不会影响编码的数据库中?任何帮助将不胜感激!

4

1 回答 1

1

使用“图像”数据类型将签名字符串存储为字节数组。

于 2014-03-14T20:06:53.500 回答