Access DBからPictureBoxに画像を読み込む
-
03-07-2019 - |
質問
C#WindowsアプリケーションのPictureBoxで、Access DBにOLEオブジェクトとして保存された画像を読み取ろうとしました。
これを行うコードを以下に示します:
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;";
OleDbConnection oConn = new OleDbConnection(connString);
oConn.Open();
string commandString = "select * from employee where id = " + id + "";
OleDbCommand oCmd = new OleDbCommand(commandString, oConn);
OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (oReader.Read())
{
txtID.Text = ((int)oReader.GetValue(0)).ToString();
txtName.Text = (string)oReader.GetValue(1);
txtAge.Text = ((int)oReader.GetValue(2)).ToString();
txtType.Text = (string)oReader.GetValue(3);
byte[] imageBytes = (byte[])oReader.GetValue(4);
MemoryStream ms = new MemoryStream();
ms.Write(imageBytes, 0, imageBytes.Length);
Bitmap bmp = new Bitmap(ms);
pbPassport.Image = bmp;
}
上記のコードを実行すると、「Parameter is not valid」例外が次の行にスローされます。
Bitmap bmp = new Bitmap(ms)
例外メッセージから、「ms」が認識できない形式であることが明らかです。これを乗り越えるための提案はありますか?
解決
バイトストリームが何らかの理由で破損しています。正確な方法を試しましたが、代わりにファイルからのPNGデータでバイト配列を埋めました。
データベースからのストリームと、データベース内のイメージのソースであるファイルからのストリームの2つのストリームを作成することをお勧めします。次に、それらをバイトごとに比較します。差が1バイトでもある場合、データベースイメージデータが破損しています。
他のヒント
残念ながら、良い答えはありませんが、試したときに同じ結果が得られたことを伝えることができます。時々、バイト配列の最初の78バイトをスキップしても動作しましたが、動作しなかったことがあります。
これは、OLEオブジェクトのデータ型がフィールドにある種のヘッダーを格納し、AccessがそれがどのタイプのOLEオブジェクトであるかを認識するためです。このヘッダーが停止し、実際のデータが開始された場所を正確に解決する信頼できる方法を見つけることができませんでしたが、私もあきらめたので、幸運です:)
AccessHdrのGoogle検索を実行します。 AccessHdr.cppおよびAccessHdr.hへの参照があります。これらは、ヘッダーなしでストリームを抽出するために必要なものを示します。
OLEオブジェクトを簡単に読み取ることはできません。実際、データベース内にOLEオブジェクトとして画像を保持することは悪い習慣です。
一部のストレージでemをBLOBオブジェクトまたはパスとファイル名として持つことが推奨されます。 AccessImagineは、MS AccessとC#の両方のシナリオを処理できます。こちらからダウンロードできます- http://access.bukrek.net
お試しください:
pbPassport.Image = Image.FromStream(ms);