次のオブジェクトがあります。
[Serializable]
public class ExampleImage
{
public int ID { get; set; }
public string Filename { get; set; }
public byte[] Content { get; set; }
}
これを に保存List<ExampleImage>
し、次の関数に渡して文字列にシリアル化します。
static string SerializeObjectToXmlString(object o)
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(o.GetType());
System.IO.StringWriter writer = new System.IO.StringWriter();
serializer.Serialize(writer, o);
return writer.ToString();
}
次に、このシリアル化された文字列をSQL2000のストアド プロシージャにとして渡しNTEXT
、データベースに挿入するために処理します。
SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')
私が抱えている問題は、画像がゴミ箱に入れられていることです。btye[]
が DB に正しく保存されていません。他のフィールドは問題ありません。バイナリ データを XML 経由で SQL に送信しようとしたのはこれが初めてなので、この時点で何か間違っている可能性があります。私のSerializeObjectToXmlString
関数は問題であり、byte[]
適切にシリアル化を処理していません.SQL関数、またはXMLをパラメータOpenXML
として送信しているという事実さえあります。NTEXT
シリアル化関数がバイナリを適切にエンコードすることを期待しますが、間違っている可能性があります。
何が問題なのか、一度にたくさんの画像を保存するためのより良い方法があるのでしょうか?
編集:何が起こっていると思いますかbyte[]
、シリアライザーがbase64文字列に変換し、それがbase64としてストアドプロシージャに渡されます。次に、この base64 文字列を SQL の Image フィールドに保存し、btye[]
. byte[]
テーブルに挿入する前に、どうにかしてbase64からaに取得する必要があると思いますか?
編集:ストアド プロシージャを一度に 1 つのイメージだけを実行し、XML を使用せずbyte[]
、型として渡し、Image
すべての呼び出しをトランザクションにラップするように変更することが唯一の選択肢であると考え始めています。