0

私は小さな概念実証プロジェクトに取り組んでいます。このプロジェクトでは、クライアントが画像ファイルをあるbyte[]形式で送信し、サーバーがそのデータをデータベースのImage列に挿入しますVarBinary(MAX)。この部分は正常に動作しますが、データをバイト配列に変換してクライアントに送信しようとすると問題が発生します。

データベースには、データを取得して XML で返すストアド プロシージャがあります。

SELECT 
    ...
    asset.Image AS 'Image'
FROM ASSETS AS asset
WHERE asset.Id = @Id
FOR XML PATH('Asset')

サンプルのクエリ結果は次のようになります (実際の の値Imageはこれよりもかなり長いですが、読みやすくするために短くしています)。

<Asset>
  ...
  <Image>/9j/4AAQSkZJRgABAQEAYABgAAD/2wB</Image>
</Asset>

コードには、この XML を対応するオブジェクトに逆シリアル化するジェネリック メソッドがあります。

internal static T ExecuteQuery<T>(StoredProcedures storedProcedure, ParameterList parameters)
    {
        using (var connection = GetSqlConnection())
        {
            using (var command = new SqlCommand(storedProcedure.ToString(), connection))
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;

                foreach (var parameter in parameters)
                {
                    command.Parameters.Add(new SqlParameter(parameter.Key.ToString(), parameter.Value));
                }

                connection.Open();

                var data = command.ExecuteScalar();

                return DeserializeXml<T>(data.ToString());
            }
        }

型 (これは、Assetこのジェネリック メソッドに渡すものです) にはいくつかのプロパティがあり、そのうちの 1 つが次のImageとおりです。

public class Asset
{
    public Asset()
    {
    }

    ...

    [DataMember]
    [XmlElement("Image")]
    public byte[] Image { get; set; }
}

プログラムを実行すると、次のエラーが発生します。

 There is an error in XML document

デシリアライザーが値に問題を抱えているようです (このプロパティVarBinaryを追加する前は正常に動作していました)。Imageなぜこれが起こっているのでしょうか?データを元に戻すには、メモリ ストリームを使用する必要がありますか?

4

1 に答える 1

0

XML をデータベースに保存する方法を確認することをお勧めします。バイト オーダー マークが XML と共にデータベースに保存されている場合、XML の逆シリアル化は失敗します (これは通常、実行方法によって異なります)。

XML データをデータベースに保存するときにバイト オーダー マークを削除する方法については、この同様の質問を参照してください。

于 2013-08-07T21:03:48.153 に答える