1

(潜在的に) 大きい署名付き XML 文字列を格納している SQL CE 4.0 データベースがあります。ntext現在、 4000 バイトの制限があるため、この文字列を type の列に格納しています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 列に表示されます。

入力パラメータの変更

stringしたがって、いくつか読んだ後、 aが として正しく挿入され、ntextとして解釈されないことを確認するにはnvarchar、次のようにパラメーターの型を指定する必要があることがわかりました。

SqlCeParameter param = command.Parameters.Add("@signedObject", SqlDbType.NText);
param.Value = signedXmlObject;

これにより、大きな文字列を正しく挿入できるようになり、問題が解決されました。

署名検証

SignedXmlしたがって、私のプログラムはデータベースからこの文字列を読み取り、それを XML ファイルに入力し、.NETクラスを使用して署名を検証しようとします。問題は、署名が正しく検証されないことです。

本当の質問 なぜこれが起こるのでしょうか? 私の XML ファイルは UTF-8 であるため、これが文字列を格納する形式です。これを列に格納ntextすると、UTF-16 として格納されている場合、文字列がわずかに変更されますか? また、SQL が以前のように入力を解釈するとnvarchar、署名の検証が成功するのはなぜでしょうか? エンコーディングに影響を与えないデータベースにこのデータを保存するより良い方法はありますか? どんな助けでも大歓迎です!

4

1 に答える 1

1

「画像」データ型を使用して、符号付き文字列をバイト配列として格納します。

于 2014-03-14T20:06:53.500 に答える