SQLデータベースに保存する画像を使用してオブジェクトをシリアル化
-
13-09-2019 - |
質問
私は、以下の目的を持っています:
[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();
}
Iは、その後、データベースに挿入するための取り扱いNTEXT
としての SQL2000するにストアドプロシージャにこのシリアライズ文字列を渡します
SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')
私が午前問題は、ゴミ箱に移動なっている画像です。 btye[]
はDBに適切に救われていません。他のフィールドだけで結構です。これは私が最も可能性が高い。この時点では何か間違ったことをやっているので、SQLにXML経由でバイナリデータを送信しようとしたのは初めてです。私SerializeObjectToXmlString
機能は問題であり、それは、適切に多分byte[]
のSQL関数または私はOpenXML
のPARAMなどでXMLを送信していますことをしても事実をNTEXT
のシリアライズを処理していません。私は適切にバイナリをエンコードするためにシリアル化機能を期待するが、私は間違っている可能性があります。
任意のアイデア問題または多分一度に画像の束を保存するより良い方法は何ですか?
の編集の私は、何が起こっているかと思いますが、シリアライザは、その後、BASE64としてストアドプロシージャに渡さ取得されたbase64文字列の中にbyte[]
を行っています。私は、SQLの画像フィールドに、このbase64文字列を保存し、btye[]
としてそれを読んでいます。だから私は、私は何とか私のテーブルに挿入する前に、byte[]
にbase64でからそれを取得する必要があると思いますか?
の編集の私は、一度に1枚の画像を行うためにストアドプロシージャを変更していないXMLを使用して、ちょうどbyte[]
タイプとラップとしてImage
に渡すために、私の唯一の選択肢を考えるようにされ始めていますトランザクション内のすべての呼び出します。
解決
、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シリアル化のためには意味がありません)。
他のヒント
の代わりにそれをXMLにシリアライズするのは、私は[]バイトにそれをシリアライズうとvarbinary型(MAX)のそれを保存し、あなたのDB内のフィールドを入力します。
テキストフィールドか何かにそれを保存し、その後、BASE64に変換しようとすることができます。