2017-01-31 12 views
2

Я пытаюсь получить изображение из MS Access DB. Данные извлекаются правильно, но когда я пытаюсь отобразить некоторую ошибку, отображается. Мой код для отображения изображения является,Снятие формы объекта OLE (bitmap) MS Access в Visual Studio C#, что случилось в моем коде?

  ... 
      byte[] photoBytes = (byte[])res[11]; 
      var ms = new System.IO.MemoryStream(photoBytes); 
      image.Image = new System.Drawing.Bitmap(ms); 
      ... 

Ошибка: Дополнительная информация: Параметр не является допустимым. enter image description here

Может ли кто-нибудь сказать мне, где ошибка, или вероятность ошибки?

моя функция

public OleDbDataReader studentInfo(String adm_no) 
    { 
     OleDbConnection con = new OleDbConnection(ConnStr); 
     con.Open(); 
     OleDbCommand command = new OleDbCommand("SELECT * FROM student_info WHERE adm_no = '"+adm_no+"'", con); 
     OleDbDataReader res = command.ExecuteReader(); 
     return res; 
    } 
+2

, пожалуйста, не размещайте скриншоты кода, особенно если они ** с низким разрешением ** и _unreadable_ – MickyD

+2

Является ли поле объектом Ole или вложением? Не могли бы вы разместить где-нибудь образец базы данных? Кроме того, вы видели это: http://stackoverflow.com/questions/25864092/extracting-files-from-an-attachment-field-in-an-access-database –

ответ

5

Насколько я помню, OLE - это звери. Если вы точно знаете, какой тип данных у вас есть, у вас есть какие-то шансы, если вы проверите его двоичную структуру. OLE - это контейнер, поэтому IMO никогда не просто чистый контент.

У меня больше нет кода, но я помню, как рыбалка использовалась в шестнадцатеричных вариантах OLE разных типов (Excel, Word, Textfiles, Images, ...) и заканчивалась вероятностью успеха 80%. Если это было из-за типов, которые мы решили поддержать, или мои очень ограниченные знания о внутренней структуре OLE, я больше не могу сказать.

Моя рекомендация для отладки будет абсолютно уверены, у вас есть исходные данные растрового изображения, прежде чем дело с бинарными данными на всех:

Мой подход заключается в создании небольшой объект (в данном случае растрового изображения), магазин его в БД, получить BLOB его и найти известный шаблон там. Я помню, что я нашел некоторые структуры - например, размер байта объекта поиска - путем обратного проектирования и несколько стабильное смещение к началу данных.

Если вы, однако, знаете - или даже лучше - имеют точную структуру и реализацию OLE-объекта и способны справиться с этим, я абсолютно уверен, что вам удастся также его сохранить и открыть его как растровое изображение.

Удачи вам!

0

Посмотрите here для примера того, что вы пытаетесь сделать, хотя этот пример для JPEG не Bitmap. Поскольку у вас есть byte[], вам нужно будет сделать что-то подобное для преобразования:

using (MemoryStream ms = new MemoryStream(photoBytes)) 
{ 
    Bitmap img = (Bitmap)Image.FromStream(ms); 
} 
+0

вы имеете в виду, что это –

+0

байт [] photoBytes = (байты []) разрешение [11]; с использованием (MemoryStream ms = new MemoryStream (photoBytes)) { Bitmap img = (растровое изображение) Изображение. FromStream (ms); image.Image = new System.Drawing.Bitmap (ms); } –

+0

Попробуйте и посмотрите, как это происходит. Если нет, вы можете уйти от выполнения только 'image.Image = img', так как у вас уже есть объект Bitmap. – awh112

0

Там что-то не так с вашим потоком байтов. Обычно я бы сказал, чтобы проверить, установлен ли 0, прежде чем передать его в конструктор Bitmap - если он находится в конце потока, возможно, что вы эффективно передаете пустой поток, но это должно быть " В этом случае.

В конструкторе есть несколько мест, где исключение аргумента будет выбрано, но InvaildParameter должно быть связано с чем-то неправильным с потоком байта, который вы извлекаете. Смотрите здесь: https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Bitmap.cs,cbbb65af7f6fafdb,references

И здесь: https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/Gdiplus.cs,4edcade52d698713

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