Member 11572517 Ответов: 1

Настольное приложение C#, которое не смогло занять или извлечь память в виде изображения в качестве вывода из базы данных?


Для всех, решите эту проблему, я новичок в c#,
Я сделал одно настольное приложение, моя проблема в том, что мне не удалось получить значение изображения из базы данных OLEDB, такой как MS Access.

В коде я попробовал событие textbox_keydown которое с базой данных;

есть 5 текстовых полей и одно графическое поле для изображения.

В текстовом поле штрих-кода я сканирую или ввожу номер штрих-кода, а затем извлекаю результат из базы данных MS Access при нажатии клавиши этого текстового поля.

В чем моя ошибка?, и что делать, чтобы ее устранить?

Ошибка генерируется при img = (byte[])dr[5];. следующий код для этого события.

private void txtbarcode_KeyDown(object sender, KeyEventArgs e)
       {
           if (e.KeyCode == Keys.Enter)
           {
               OleDbCommand cm = new OleDbCommand("select * from stock_tab where Barcode = @Barcode",cn);
               cm.Parameters.Add(new OleDbParameter("@Barcode", txtbarcode.Text));
               cn.Open();
               OleDbDataReader dr = cm.ExecuteReader();
               while(dr.Read()){
                   txtpnm.Text = dr.GetString(1);
                   txtdesc.Text = dr.GetString(2);
                   txtqty.Text = Convert.ToString(dr.GetInt32(3));
                   txtprc.Text = Convert.ToString(dr.GetInt32(4));
                   MemoryStream m = new MemoryStream();
                   //pbproduct.Image.Save(m, pbproduct.Image.RawFormat);
                   byte[] img = (byte[])dr[5];
                   MemoryStream ms1 = new MemoryStream(img);
                   pbproduct.Image = Image.FromStream(ms1);
               }
               dr.Close();
               cn.Close();
           }
       }


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

Я попытался выделить память изображения для извлечения значений из БД,но ошибка: не удается привести систему.Тип DBNull для системы.Byte[]; это ошибка, генерируемая по адресу: img = (byte[])dr[5];

1 Ответов

Рейтинг:
1

OriginalGriff

Ошибка довольно ясна:

can't cast system.DBNull type to System.Byte[];
Значение, возвращаемое из вашей базы данных, не является данными - это null. Это означает, что либо вы не вставили изображение в этот столбец при сохранении строки, либо это неправильный столбец.
Учитывая, что вы используете SELECT * FROM а затем получить доступ к вашим столбцам численно, начиная с 1, это наиболее вероятно.
Никогда не использовать SELECT * - всегда перечисляйте нужные вам столбцы. Таким образом, изменения в порядке столбцов БД не приведут к сбою вашего приложения, и вы не получите информацию, которая вам не нужна.
Так что попробуй:
SELECT PNM, Desc, Qty, PRC, Picture FROM Stock_tab ...

И используйте имя столбца для доступа к DataReader:
if (dr.Read())
    {
    txtpnm.Text = (string) dr["PNM"];
    txtdesc.Text = (string) dr["Desc"];
    txtqty.Text = dr["Qty"].ToString();
    txtprc.Text = dr.["PRC"].ToString();
    byte[] img = (byte[])dr["Picture"];
    MemoryStream ms1 = new MemoryStream(img);
    pbproduct.Image = Image.FromStream(ms1);
    }


Member 11572517

спасибо, сэр, я постараюсь переодеться в соответствии с вами.

Member 11572517

Сэр, в соответствии с u я изменил его, но та же ошибка генерируется в Memorystream ms1 = new memorystream(img);, будет ли ошибка связана с изображением для хранения в БД и извлечения из него?

OriginalGriff

Что такое точное сообщение об ошибке?

Member 11572517

крайне сожалею, сэр, вот святой месяц Рамазан так, что я не мог ответить на него; ошибка: InvalidCastException была необработана:
Невозможно привести объект типа " System.DBNull", чтобы ввести " Syste. byte []".
еще раз крайне сожалею, сэр..

OriginalGriff

Все в порядке - никаких проблем.
Сообщение об ошибке означает, что значение, возвращаемое из вашей БД, равно NULL - в этом поле этой строки нет информации об изображении.
Итак, начните с этого: проверьте свою БД и свой код вставки, чтобы выяснить, почему ваша БД ничего не содержит, когда вы ожидаете, что у нее есть данные.
Если не имеет значения, что изображения нет, то сравните значение DB с DBNull.Значение перед тем, как вы попытаетесь его разыграть, и установите вместо него изображение по умолчанию.

Member 11572517

Сэр, в БД я использовал тип данных OLE Object для поля изображения, согласно исследованиям на разных сайтах, правильно это или нет? возможно, именно по этой причине изображение не может храниться в БД.

Member 11572517

Сэр, в БД я использовал тип данных OLE Object для поля изображения, согласно исследованиям на разных сайтах, правильно это или нет? возможно, именно по этой причине изображение не может храниться в БД.

OriginalGriff

Изображения могут храниться в БД, это не проблема (хотя на самом деле doign это может быть проблемой для некоторых людей):

http://www.codeproject.com/Tips/465950/Why-do-I-get-a-Parameter-is-not-valid-exception-wh

Показывает, как это сделать для SQL Server, но версия OleDb такая же.
Дело не в том, что изображение *не может* храниться в БД - они могут, а иногда вам это нужно, - но в том, что по крайней мере в одной строке вы *не* сохранили изображение или что-то еще. Это может быть допустимо в вашей системе, я не знаю. Но если это так, то вам нужно кодировать, когда это произойдет, используя DBNull.Ценность
Если это не так, то вам нужно посмотреть, как строка была создана без него, а затем исправить вашу БД, прежде чем двигаться дальше (и удалить нулевое разрешение из столбца БД, чтобы это не повторилось).

Member 11572517

Я думаю, сэр, это трудно понять, но я постараюсь понять, усвоить новый урок.

OriginalGriff

Это все, о чем мы можем просить! :)