Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переходы по БД которая содержит картинки 
V
    Опции темы
Redstuff
Дата 21.8.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


Профиль
Группа: Участник
Сообщений: 497
Регистрация: 27.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Столкнулся с проблемой перехода к записи в таблице, которая содержит картинки.
Есть таблица, но не во всех записях содержится картинка и возникает следующая ошибка:
(8 строка)
Код

Не удалось привести тип объекта "System.DBNull" к типу "System.Byte[]".

Участок кода:
Код

this.BindingContext[ds, "Hardware"].Position += 1;
HardwareInfo();
SqlCommand cmdSelect = new SqlCommand("select Photo from Hardware where ID=@ID", con);
cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
сmdSelect.Parameters["@ID"].Value = txtID.Text;
con.Open();

byte[] barrImg = (byte[])cmdSelect.ExecuteScalar();
string strfn = Convert.ToString(DateTime.Now.ToFileTime());
FileStream fs = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write);
fs.Write(barrImg, 0, barrImg.Length);
fs.Flush();
fs.Close();

Bitmap bmp = new Bitmap(strfn);
pictureBox1.BackgroundImage = bmp;
pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;

ShowPosition();
con.Close();

Как можно решить проблему? Хотелось бы получать в pictureBox1 текстовую надпись "картинка отсутствует" (без применения картинок хранящихся в бд) или вовсе пустой pictureBox1.

На ум приходит лишь одна мысль, загружать картинки с надписью "картинка отсутствует", но может есть лучше решение?

Это сообщение отредактировал(а) Redstuff - 21.8.2007, 23:01


--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 22.8.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Изменяем код :
Код

object barrImgObj = cmdSelect.ExecuteScalar(); //это до 8-й строчки
if (barrImgObj != null)
{
 byte[] barrImg = (byte[])barrImgObj; //это вместо строки 8
// здесь весь код для обработки картинки; похоже, что до 19 строчки включительно
}
con.Close();



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Redstuff
Дата 22.8.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


Профиль
Группа: Участник
Сообщений: 497
Регистрация: 27.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Idsa, а в запросе не надо ничего менять? Потому как 
Код

if (barrImgObj != null)

это условие выполняется всегда... И ошибка на строку 
Код

byte[] barrImg = (byte[])barrImgObj;



--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 22.8.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Redstuff @  21.8.2007,  23:00 Найти цитируемый пост)
Есть таблица, но не во всех записях содержится картинка и возникает следующая ошибка:

Хм... А те строки, в которых нет фоток, - пустые?
Приведи получившийся код.

Это сообщение отредактировал(а) Idsa - 22.8.2007, 11:53


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Redstuff
Дата 22.8.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


Профиль
Группа: Участник
Сообщений: 497
Регистрация: 27.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Idsa, содержание таблицы примерно такое (упрощенный пример):
 ID   |   Name   |  Photo  ....
 -----------------------------------
   1  | samsung |   pic1 .....
   2  | asus        |   null
   .........
Код

private void bMoveNext_Click(object sender, EventArgs e)
        {
            this.BindingContext[ds, "Hardware"].Position += 1;
            HardwareInfo();
            SqlCommand cmdSelect = new SqlCommand("select Photo from Hardware where ID=@ID", con);
            cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
            cmdSelect.Parameters["@ID"].Value = txtID.Text;
            con.Open();

            object barrImgObj = cmdSelect.ExecuteScalar(); //это до 8-й строчки
            if (barrImgObj != null)
            {
                byte[] barrImg = (byte[])barrImgObj; //это вместо строки 8
                string strfn = Convert.ToString(DateTime.Now.ToFileTime());
                FileStream fs = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write);
                fs.Write(barrImg, 0, barrImg.Length);
                fs.Flush();
                fs.Close();

                Bitmap bmp = new Bitmap(strfn);
                pictureBox1.BackgroundImage = bmp;
                pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;

                ShowPosition();
            }
            con.Close();
        }



--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 22.8.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Поставь breakpoint на строчку 11 и посмотри, чему равен barrImgObj для строки, в которой нет фотографии.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Redstuff
Дата 22.8.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


Профиль
Группа: Участник
Сообщений: 497
Регистрация: 27.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



barrImgObj = {}
barrImg = null


--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 22.8.2007, 12:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Действительно, значение не приводится к null...
Тогда предлагаю вот такой вариант через try-catch:
Код

 SqlCommand cmdSelect = new SqlCommand("select photo from testTable where ID=@ID", con);
      cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
      cmdSelect.Parameters["@ID"].Value = txtID.Text;
      try
      {
        con.Open();
        byte[] barrImg = (byte[])cmdSelect.ExecuteScalar();
        string strfn = Convert.ToString(DateTime.Now.ToFileTime());
        FileStream fs = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write);
        fs.Write(barrImg, 0, barrImg.Length);
        fs.Flush();
        fs.Close();

        Bitmap bmp = new Bitmap(strfn);
        pictureBox1.BackgroundImage = bmp;
        pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
        ShowPosition();
      }
      catch (InvalidCastException ex)
      {

      }
      finally 
      {
        con.Close();
      }



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 22.8.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



просто null и DBNull (который возвращается из базы при отсутсвии картинки) - это разные вещи... DBNull - это объект класса, а null - пустой указатель, указатель на ничто.
MSDN
Цитата

Do not confuse the notion of a null reference (Nothing in Visual Basic) in an object-oriented programming language with a DBNull object. In an object-oriented programming language, a null reference (Nothing in Visual Basic) means the absence of a reference to an object. DBNull represents an uninitialized variant or nonexistent database column.


Redstuff, ты не пробовал вместо if (barrImgObj != null) юзать  if (barrImgObj != DBNull.Value) ?




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 22.8.2007, 13:04 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(tol05 @  22.8.2007,  12:47 Найти цитируемый пост)
просто null и DBNull (который возвращается из базы при отсутсвии картинки) - это разные вещи

Действительно. Тогда получим два рабочих варианта:
Через if (с dbNll):
Код

private void bMoveNext_Click(object sender, EventArgs e)
        {
            this.BindingContext[ds, "Hardware"].Position += 1;
            HardwareInfo();
            SqlCommand cmdSelect = new SqlCommand("select Photo from Hardware where ID=@ID", con);
            cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
            cmdSelect.Parameters["@ID"].Value = txtID.Text;
            con.Open();
            object barrImgObj = cmdSelect.ExecuteScalar(); //это до 8-й строчки
            if (barrImgObj != DBNull.Value)
            {
                byte[] barrImg = (byte[])barrImgObj; //это вместо строки 8
                string strfn = Convert.ToString(DateTime.Now.ToFileTime());
                FileStream fs = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write);
                fs.Write(barrImg, 0, barrImg.Length);
                fs.Flush();
                fs.Close();
                Bitmap bmp = new Bitmap(strfn);
                pictureBox1.BackgroundImage = bmp;
                pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
                ShowPosition();
            }
            con.Close();
        }

и через try-catch:
Код

private void bMoveNext_Click(object sender, EventArgs e)
        {
            this.BindingContext[ds, "Hardware"].Position += 1;
            HardwareInfo();
          SqlCommand cmdSelect = new SqlCommand("select photo from testTable where ID=@ID", con);
      cmdSelect.Parameters.Add("@ID", SqlDbType.Int, 4);
      cmdSelect.Parameters["@ID"].Value = txtID.Text;
      try
      {
        con.Open();
        byte[] barrImg = (byte[])cmdSelect.ExecuteScalar();
        string strfn = Convert.ToString(DateTime.Now.ToFileTime());
        FileStream fs = new FileStream(strfn, FileMode.CreateNew, FileAccess.Write);
        fs.Write(barrImg, 0, barrImg.Length);
        fs.Flush();
        fs.Close();
        Bitmap bmp = new Bitmap(strfn);
        pictureBox1.BackgroundImage = bmp;
        pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
        ShowPosition();
      }
      catch (InvalidCastException ex)
      {
      }
      finally 
      {
        con.Close();
      }
        }

Если во второй вариант добавить catch'и для con.Open и fs.Write, то вообще красота получится smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Redstuff
Дата 22.8.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


Профиль
Группа: Участник
Сообщений: 497
Регистрация: 27.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Спасибо все работает, но надо теперь чтобы было уведомление об отсутствии картинки или просто ее отсутствие в pictureBox.
Next
Код

catch (InvalidCastException ex)
            {
                pictureBox1.Image = Image.FromFile("C:\\notphoto.jpg");
            }

Когда попадаю на запись, которая не содержит картинки то вижу картинку notphoto.jpg
После двигаюсь дальше или в обратном направлении, она попрежнему висит
Пробовал так:
Код

pictureBox1.Image = Image.FromFile("C:\\notphoto.jpg");
pictureBox1.Image.Dispose();
pictureBox1.Image = null;

Но намного лучше не стало...

Пока писал уже 2 поста)

Это сообщение отредактировал(а) Redstuff - 22.8.2007, 13:14


--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 22.8.2007, 13:33 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Redstuff @  22.8.2007,  13:13 Найти цитируемый пост)
Когда попадаю на запись, которая не содержит картинки то вижу картинку notphoto.jpg
После двигаюсь дальше или в обратном направлении, она попрежнему висит

Это потому что существующую картинку ты выводить через BackgroundImage, а "несуществующую" - через Image. Выбери один вариант и используй его для обоих случаев.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Redstuff
Дата 22.8.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


Профиль
Группа: Участник
Сообщений: 497
Регистрация: 27.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Idsa, спасибо!


--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 22.8.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Redstuff @  22.8.2007,  13:48 Найти цитируемый пост)
Idsa, спасибо! 

Рад помочь smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 22.8.2007, 16:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



OFFTOP...


Цитата(Idsa @  22.8.2007,  13:04 Найти цитируемый пост)
Действительно. Тогда получим два рабочих варианта:
 smile
не в обиду будь сказано, но...
обработку исключений обычно тогда, когда программист не может предусмотреть какая сложится run-time ситуация.
Здесь же налицо элементарная проверка типа возвращенного значения (малоизвестного, как оказалось, правда ... )

Не проще ли проверить тип полученного объекта (который явно может быть или DBNull или byte[]), и выйти из процедуры, чем ждать, пока CLR создат, инициализирует и выбросит объект исключения, а потом будет проверять по стеку наличие обработчика на перехват?..

есть еще третий рабочий вариант: в EntryPoint программы все загнать в AppDomain.UnhandledException и в обработчике написать что-то типа "Вах! Что-то прошло не так!" smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.