Member 14630006 Ответов: 1

Как загрузить картинку из access db в picturebox


я получаю ошибку на линии
ImageByte = comm.ExecuteScalar();

ошибка заключается в следующем
"Cannot implicitly convert type 'object' to 'byte[]'. An explicit conversion exists (are you missing a cast?)"


Что я уже пробовал:

byte[] ImageByte = null;
MemoryStream MemStream = null;
PictureBox PicBx = new PictureBox();
object OB;

string WorkingDirectory = Application.StartupPath + "\\";
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + WorkingDirectory + "DBFile.mdb; Persist Security Info=True";
cnction = new OleDbConnection(connString);
cnction.Open();
int ImageID = 6;
sqlCommand = "SELECT ImageObject FROM ImagesTable WHERE ImageID = " + ImageID + "";
comm = new OleDbCommand(sqlCommand, cnction);
ImageByte = comm.ExecuteScalar();
MemStream = new MemoryStream(ImageByte);
PicBx.Image = Image.FromStream(MemStream);
}

Richard Deeming

sqlCommand = "SELECT ImageObject FROM ImagesTable WHERE ImageID = " + ImageID + "";

Не делай этого так!

Пока в этот конкретный экземпляр, так как параметр является int, вы избежали a SQL-инъекция[^] уязвимость, построение ваших запросов таким образом-это все еще очень плохая привычка, чтобы попасть в нее.

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

const string sqlCommand = "SELECT ImageObject FROM ImagesTable WHERE ImageID = ?";
using (OleDbCommand comm = new OleDbCommand(sqlCommand, cnction))
{
    comm.Parameters.AddWithValue("ImageID", ImageID);
    byte[] imageBytes = (byte[])comm.ExecuteScalar();
    MemoryStream ms = new MemoryStream(imageBytes);
    PicBx.Image = Image.FromStream(ms);
}

1 Ответов

Рейтинг:
2

RickZeeland

Это означает, что ваше поле ImageObject в базе данных имеет другой тип, чем ожидалось.
Чтобы узнать, как определить это поле и прочитать его, см. пример здесь: Чтение и запись изображений в базы данных MS-Access 2007 и выше на языке C#, VB.NET для Visual Studio 2017[^]

В частности обратите внимание:

Цитата:
Если вам действительно нужно хранить изображения внутри таблицы базы данных MS-Access, имейте в виду, что С MS-Access 2007 и выше добавление изображения в запись из MS-Access будет хранить не только изображение, но и заголовок


Richard Deeming

На самом деле, я не думаю, что это проблема здесь. ExecuteScalar возвращает object. В то время как VB позволит вам назначить это переменной массива байтов, C# требует приведения:

ImageByte = (byte[])comm.ExecuteScalar();

RickZeeland

Это кажется правильным решением, Браво !