【问题标题】:Storing a Large Signed UTF-8 String in SQL CE 4.0 Database在 SQL CE 4.0 数据库中存储大的签名 UTF-8 字符串
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2012-12-19
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多