2014-02-24 2 views
2

Моего кодаПолучить Длинные двоичные данные (изображения) от доступа с помощью VB.NET

Dim con As New OleDb.OleDbConnection 
    Dim dbProvider As String 
    Dim dbSource As String 

    dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" 
    dbSource = "Data Source=" & My.Settings.bowlingballdatabase 



    Dim selectString As String = "Select Picture From BowlingBall WHERE LName = 'Smith'" 
    Dim oleConnect As New OleDb.OleDbConnection 
    oleConnect.ConnectionString = dbProvider & dbSource 
    oleConnect.Open() 
    Using oleDBCmd As OleDb.OleDbCommand = oleConnect.CreateCommand() 
     oleDBCmd.CommandType = CommandType.Text 
     oleDBCmd.CommandText = selectString 
     Using oleDbReader As OleDb.OleDbDataReader = oleDBCmd.ExecuteReader() 
      oleDbReader.Read() 
      Dim ImageBytes As Byte() = CType(oleDbReader(0), Byte()) 
      Dim ms As New MemoryStream(ImageBytes) 
      Dim img As Image = Image.FromStream(ms) 
      Me.PictureBox1.Image = img 
     End Using 
    End Using 
    oleConnect.Close() 

Я думаю, что его проблема с SQL команд, может быть? Я получаю сообщение об ошибке «Параметр не действует» на следующей строке:

Dim img As Image = Image.FromStream(ms) 

ответ

1

Там нет ничего плохого с кодом сами по себе. Ваша проблема почти наверняка связана с тем, как Access сохраняет изображения, когда они встроены из самого приложения Access. В этих случаях OLE «обертка» добавляется к необработанным данным изображения до того, как она будет сохранена в таблице. Это хорошо работает при обращении с изображениями из Access, но это может вызвать проблемы при работе с этими изображениями из внешних приложений, таких как ваш проект .NET.

Ваш код извлекает объект изображения с оболочкой OLE из базы данных Access и пытается создать с ним объект .NET Image. Проблема заключается в том, что, хотя объект Image может распознавать множество типов изображений (например, растровое изображение, JPEG и т. Д.), «OLE-wrapped image object format» не является одним из них. Поэтому вам необходимо удалить OLE-оболочку из потока байтов, прежде чем передавать ее на Image.FromStream().

Для получения дополнительной информации см. Мой другой ответ here, в котором показано, как «разворачивать» объекты с использованием кода из более раннего ответа here.

+0

спасибо Горд. Дон, я знаю, почему я никогда не одобрял это раньше. Ваша ссылка была полезной – DidIReallyWriteThat

-2

когда вы oleDbReader (0), вы получите имя поля первого поля в возвращенном объекте читателя. используйте oleDbReader (0) (0), чтобы получить первый элемент в первом столбце, вы знаете, как это происходит.

Dim ImageBytes As Byte() = CType(oleDbReader(0)(0), Byte()) 
+0

Здесь не проблема. 'CType (oleDbReader (0), Byte())' преобразует весь объект в массив 'Byte', чего хочет OP. На самом деле ваш код не сработает, потому что 'CType (oleDbReader (0) (0), Byte())' будет возвращать * один байт *, который не может быть неявно передан в массив. -1 (Извините.) –

+0

Я стою исправлен и благодарю Горда. Когда datareader предоставляет файлы (столбцы) и строки, я ожидаю, что он будет в формате двухмерного массива. Я думаю, что пришло время оторваться от типизированных наборов данных. – user2930100

Смежные вопросы