1

次のオブジェクトがあります。

[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すべての呼び出しをトランザクションにラップするように変更することが唯一の選択肢であると考え始めています。

4

3 に答える 3

2

XML にシリアル化する代わりに、byte[] にシリアル化し、DB の varbinary(MAX) 型フィールドに格納します。

于 2009-08-12T17:32:06.573 に答える
2

Gaidin が提案したように、base64 が最適なオプションです。これは、バイナリ データを XML に書き込む通常の方法です。次のコードを使用できます。

public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }

    [XmlIgnore]
    public byte[] Content { get; set; }

    [XmlElement("Content")]
    public string ContentBase64
    {
        get { return Convert.ToBase64String(Content); }
        set { Content = Convert.FromBase64String(value); }
    }
}

(ちなみに、Serializable属性は XML シリアライズには意味がありません)

于 2009-08-12T22:42:38.100 に答える
0

それをbase64に変換してから、TEXTフィールドなどに保存してみてください。

于 2009-08-12T22:32:06.687 に答える