2009-08-12 5 views
1

に保存する画像でオブジェクトをシリアライズは、私は、次のオブジェクトがSQLデータベース

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(); 
} 

Iは、次いで、データベースに挿入するための取り扱いNTEXTとしてSQL2000にストアドプロシージャにこのシリアライズ文字列を渡す:

SELECT * INTO #TempImages 
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage') 
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content') 

私が抱えている問題は、画像がゴミ箱になっていることです。 btye[]がDBに正しく保存されていません。他のフィールドは問題ありません。これは、バイナリデータをXML経由でSQLに送信しようとする最初の試みです。この時点で間違っている可能性が最も高いです。私のSerializeObjectToXmlStringが問題を機能していて、byte[]のシリアル化を正しく処理していないか、おそらくOpenXML SQL関数か、XMLをNTEXT paramとして送信していることさえあります。私は、バイナリを適切にエンコードする関数serializeを期待しますが、間違っている可能性があります。

画像の束を一度に保存することは、何が問題なのか、それとももっと良い方法でしょうか?

編集:私は何が起こっているかと思います、シリアライザは、その後、BASE64としてストアドプロシージャに渡さ取得されたbase64文字列へbyte[]を行っています。私はこのBase64文字列をSQLのImageフィールドに保存してbtye[]として読み込みます。だから私は何とかbase64からbyte[]まで私のテーブルに挿入する前にそれを取得する必要があると思いますか?

編集:私は私の唯一のオプションは、ストアドプロシージャを変更するだけの時間で1枚の画像を行うこととXMLを使用して、ちょうどImage型としてbyte[]に渡し、内のすべての呼び出しをラップしていないと思い始めていますトランザクション。

答えて

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); } 
    } 
} 

を私は例がダウンしてトリミングされるなど、通常のフィールドのデータの一部を格納しています

2

XMLにシリアル化するのではなく、それをバイト[]にシリアル化し、DBのvarbinary(MAX)型フィールドに格納します。

+0

(ちなみに、Serializable属性は、XMLシリアル化のためには意味がありません)実際のオブジェクトのバージョンをよりシンプルにすることができます。ファイルの内容は唯一のバイナリデータですが、私はまだDBに保存されている他のデータを取得する必要があります。 – Kelsey

+0

SQL Server 2000でvarbin(max)を使用していない場合は、image –

0

これをbase64に変換して、TEXTフィールドなどに保存してみることもできます。

関連する問題