I have a C# program in visual studio 2010 where I am accessing the data from my access database. I can get all of the information, except for the image. I have followed the step
The procedure you describe in your question for inserting bitmap images into an Access database will save the image imbedded in an OLE Object. If you want to use just the bitmap image in your C# program you need to remove the OLE "wrapper" from the binary data that is retrieved from Access.
For example, if I retrieve it from the Access database and try to convert it directly to a new Bitmap
object...
private void Form1_Load(object sender, EventArgs e)
{
using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb;"))
{
con.Open();
using (var cmd = new OleDbCommand("SELECT LastName, FirstName, Photo FROM Clients WHERE ID=3", con))
{
OleDbDataReader rdr = cmd.ExecuteReader();
rdr.Read();
this.textBox1.Text = rdr["FirstName"].ToString();
this.textBox2.Text = rdr["LastName"].ToString();
byte[] photoBytes = (byte[])rdr["Photo"];
var ms = new System.IO.MemoryStream(photoBytes);
this.pictureBox1.Image = new System.Drawing.Bitmap(ms);
ms.Close();
}
con.Close();
}
}
...I get a "Parameter is not valid" error:
However, if I remove the OLE "wrapper" using the GetImageBytesFromOLEField
method of the OleImageUnwrap
class in my other answer here...
var ms = new System.IO.MemoryStream(OleImageUnwrap.GetImageBytesFromOLEField(photoBytes));
...then it works:
Memory stream can be created from byte array and Image can be made from memory stream. The following code will compile:
byte[] bytes = new byte[0];
MemoryStream ms = new MemoryStream(bytes);
Image img = Image.FromStream(ms);