Прочитать картинку из БД доступа в PictureBox - PullRequest
3 голосов
/ 20 октября 2008

Я пытался прочитать изображение, сохраненное в Access DB, как объект OLE в PictureBox в приложении C # Windows.

Код, который делает это, представлен ниже:

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

Когда я выполняю приведенный выше код, в строке выдается исключение «Параметр неверен»:

Bitmap bmp = new Bitmap(ms)

Из сообщения об исключении ясно, что «ms» находится в формате, который не может быть распознан. Любое предложение, чтобы пройти это?

Ответы [ 5 ]

1 голос
/ 23 июля 2009

Вы не можете читать объекты OLE так легко. На самом деле, хранить картинки как OLE-объекты в базе данных - плохая практика.

В некоторых хранилищах желательно иметь em как объекты BLOB или путь и имя файла. AccessImagine может обрабатывать оба сценария для MS Access и C #. Вы можете скачать его здесь - http://access.bukrek.net

1 голос
/ 20 октября 2008

Выполните поиск в Google для AccessHdr. Вы найдете ссылки на AccessHdr.cpp и AccessHdr.h. Они проиллюстрируют, что нужно для извлечения потоков без заголовка.

1 голос
/ 20 октября 2008

К сожалению, у меня нет хорошего ответа для вас, но я могу сказать вам, что когда я пытался, я получал те же результаты. Иногда пропускаются первые 78 байтов массива байтов, иногда нет.

Это потому, что тип данных OLE Object хранит в поле какой-то заголовок, так что Access знает, какой это тип OLE Object. Я не мог найти надежный способ выяснить, где именно остановился этот заголовок и начались реальные данные, но я тоже сдался, так что удачи:)

0 голосов
/ 20 октября 2008

Вы можете попробовать:

pbPassport.Image = Image.FromStream(ms);
0 голосов
/ 20 октября 2008

Ваш поток данных как-то поврежден, потому что я попробовал ваш точный метод, но вместо этого заполнил байтовый массив данными PNG из файла.

Я бы предложил создать два потока, один из базы данных, а другой из файла, который был источником изображения в базе данных. Затем сравните их побайтно. Если есть хотя бы один байт разности, данные изображения базы данных повреждены.

...