私は小さな概念実証プロジェクトに取り組んでいます。このプロジェクトでは、クライアントが画像ファイルをある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
なぜこれが起こっているのでしょうか?データを元に戻すには、メモリ ストリームを使用する必要がありますか?