DataTable のObject型をbyte[]に入れる方法

[戻る]
なおぞう 2016/07/22(金) 18:06:38
よろしくお願いします。
C# VS2010で開発しております。

データベースにバイナリデータを格納している前提で、そのバイナリデータを利用する場
合のコードの書き方が分かりません。
アドバイス戴けますようお願いします。

        public static void  getPhotData(byte[] phot)
        {
            DataTable dt = DB.getData("SELECT * FROM PhotTable");←DBアクセス用の
クラス関数
            if (dt.Rows.Count > 0)
            {
                //phot =byte.TryParse(dt.Rows[0]["PHOTODATA"]);
              ↑
        バイナリデータを格納しているPHOTODATAをバイト配列photに入れたい
のですが、どうしたらキャストできるのか、調べても見つけることができませんでした。
          
            }
        }
よろしくお願い致します。

YuO [E-Mail] 2016/07/23(土) 12:32:08
BinarySerializeerを使ってバイナリシリアライズする,というのが手っ取り早い方法でしょう
か。
Serializable属性が必要になりますし,場合によってはISerializableも必要になるでしょう
が。

ただし,そもそもオブジェクトのバイナリ表現は独自で定める必要があります。
また,BinarySerializerを使ったバイナリシリアライズは,バージョン互換性の問題もありま
す。
このため,独自の方法でバイナリとの相互変換を行った方が安全だと思います。

なおぞう 2016/07/25(月) 21:55:19
>YuO様
続けてのご回答ありがとうございます。
私には難しくて、すぐにできそうにないのでこの件も現在保留中にしております。
BinarySerializeer参考にさせていただきます。

aetos 2016/08/02(火) 11:38:41
PhotoTable には何が入っているのでしょうか。
名前から推測すると画像データ、例えば JPEG のバイナリデータがそのまま格納されてい
るとか。
DB のカラムの型は(SQL Server だとすれば)varbinary なのかな。
であれば .NET 側の型は byte[] になります。

byte[] photoData = (byte[])dt.Rows[0]["PHOTODATA"];

そこから Bitmap クラスに変換したい場合は、byte[] からでは変換できませんので、一旦
 MemoryStream を通すことになるでしょう。

https://msdn.microsoft.com/ja-jp/library/e55f3s5k.aspx
https://msdn.microsoft.com/ja-jp/library/z7ha67kw.aspx

メモリ上に乗せるのが困難になるような巨大な画像ファイルだったりすると、(SQL Serve
r の)FILESTREAM 機能の利用を検討すべきですが、それはまた別の話…。

なおぞう 2016/08/02(火) 20:04:59
[[解決]]
>aetos さま
アドバイスありがとうございます。

DBからの読み込みは、以下のようにできました。
  File.WriteAllBytes(@sTmpFile, (byte[])dt.Rows[0]["IMAGEDATA"]);

またよろしくお願いいします。

古いスレッドには追加発言できません。