none
Считать картинку из бд sql ce RRS feed

  • Вопрос

  • И снова здравствуйте. На этот раз такая проблема.

    Добавляю картинку в бд sql ce:

     private void pictloader()
            {
               using( SqlCeConnection dbconnect = new SqlCeConnection(@"Data Source = databases/pictdb.sdf"))
                {
                   
               byte[] data;
               
               data = System.IO.File.ReadAllBytes(@"D:\pict\wolf.bmp");
             SqlCeCommand cmd = new SqlCeCommand("INSERT INTO pictures (pic) VALUES (@DATA)", dbconnect);
              
            
              cmd.Parameters.AddWithValue("@DATA", data);
                dbconnect.Open();
              cmd.ExecuteNonQuery();
               dbconnect.Close();
                }
    
               
            }

    Она вроде бы добавляется (изменяется размер бд после выполнения кода. После чего пытаюсь считать картинку следующим образом:

     private void picboxshow()
            {
                using( SqlCeConnection dbconnect = new SqlCeConnection(@"Data Source = databases/pictdb.sdf"))
                {
                   MemoryStream imageStream;
              
                byte[] img = new byte[0];
                     SqlCeCommand cmd1 = new SqlCeCommand(" SELECT * FROM pictures", dbconnect);
                dbconnect.Open();
                   using (SqlCeDataReader datareader = cmd1.ExecuteReader())
                {
                        img = (byte[])datareader["pic"];
                        imageStream = new MemoryStream(img);
                        imageList1.Images.Add(Image.FromStream(imageStream));
                        pictureBox1.Image = Image.FromStream(imageStream);
                        }
                   dbconnect.Close();
                }
            }

    На что получаю ошибку:

    Подскажите пожалуйста в чём ошибка.

    26 марта 2012 г. 16:48

Ответы

  • Ну тогда, там кусок кода неправильный, замените на это

    using (SqlCeDataReader datareader = cmd1.ExecuteReader())
            {
              while (datareader.Read())
              {
                img = (byte[])datareader["Pic"];
                imageStream = new MemoryStream(img);
                imageList1.Images.Add(Image.FromStream(imageStream));
                pictureBox1.Image = Image.FromStream(imageStream);
              }
            }

    • Помечено в качестве ответа Nik_A 26 марта 2012 г. 21:28
    26 марта 2012 г. 18:07
    Модератор
  • Ещё поковырялся - точно при каждом новом запуске программы размер бд становится равен исходному - 84 кб. Из Imagelist1 картинки тоже стираются.

    Такое поведение из-за того, что у вас наверняка сама база добавлена в проект, в Solution Explorer выберите файл базы данных, перейдите в ее свойства и там будет Copy to Output Directory, установите его в значение Copy if Newer или Do not copy.

    И данные не сохраняются, потому что они сохраняются в базу данных в Output директории, а при каждой компиляции и запуске проекта файл БД в Output заменяется на файл БД из папки проекта. Вот в чем подвох.


    Для связи [mail]

    • Помечено в качестве ответа Nik_A 27 марта 2012 г. 6:16
    27 марта 2012 г. 5:41

Все ответы

  • Patrool,

    Возможно, эта статья окажется для Вас полезной

    KB318639: ПРАКТИЧЕСКОЕ руководство: Сохранять и извлекать файл изображения с SQL Server CE и eVB  


    Don't forget to vote for useful replies and/or mark answers for your questions - that helps other guys to find the answer faster.

    26 марта 2012 г. 17:12
  • Спасибо, но я уже видел её, там даны примеры на VB, а у меня C# программа
    26 марта 2012 г. 17:24
  • А тип столбца в базе какой image или binary ?
    26 марта 2012 г. 17:43
    Модератор
  • Ну тогда, там кусок кода неправильный, замените на это

    using (SqlCeDataReader datareader = cmd1.ExecuteReader())
            {
              while (datareader.Read())
              {
                img = (byte[])datareader["Pic"];
                imageStream = new MemoryStream(img);
                imageList1.Images.Add(Image.FromStream(imageStream));
                pictureBox1.Image = Image.FromStream(imageStream);
              }
            }

    • Помечено в качестве ответа Nik_A 26 марта 2012 г. 21:28
    26 марта 2012 г. 18:07
    Модератор
  • Но вот другой баг вылез. Картинка показывается только после выполнения процедуры с загрузкой картинки в бд (pictloader()). Т.е. по непонятной причине после остановки выполнения программы инфа в бд стирается.

    Если выполнить pictloader(), остановить программу, потом выполнить picboxshow() - картинку не покажет, while (datareader.Read()) = false. С чем это может быть связано?

    Ещё поковырялся - точно при каждом новом запуске программы размер бд становится равен исходному - 84 кб. Из Imagelist1 картинки тоже стираются.

    • Изменено Nik_A 26 марта 2012 г. 21:55
    26 марта 2012 г. 21:33
  • Но вот другой баг вылез. Картинка показывается только после выполнения процедуры с загрузкой картинки в бд (pictloader()). Т.е. по непонятной причине после остановки выполнения программы инфа в бд стирается.

     Не должно быть так. Попробовал, работает нормально. А сколько картинок Вы грузите в БД ?

     "Из Imagelist1 картинки тоже стираются." - ну это временное хранилище, объект существует только во время выполнения программы, а после закрытия удаляется со всем его содержимым.

    27 марта 2012 г. 5:12
    Модератор
  • Ещё поковырялся - точно при каждом новом запуске программы размер бд становится равен исходному - 84 кб. Из Imagelist1 картинки тоже стираются.

    Такое поведение из-за того, что у вас наверняка сама база добавлена в проект, в Solution Explorer выберите файл базы данных, перейдите в ее свойства и там будет Copy to Output Directory, установите его в значение Copy if Newer или Do not copy.

    И данные не сохраняются, потому что они сохраняются в базу данных в Output директории, а при каждой компиляции и запуске проекта файл БД в Output заменяется на файл БД из папки проекта. Вот в чем подвох.


    Для связи [mail]

    • Помечено в качестве ответа Nik_A 27 марта 2012 г. 6:16
    27 марта 2012 г. 5:41
  • Так и есть, спасибо
    27 марта 2012 г. 6:17