none
Как передать картинки из бд в imagelist RRS feed

  • Вопрос

  • Возможно ли добавить в Imagelist картинки, хранящиеся в бд аксесс?

    Необходимо сделать нечто аналогичное:

     public static IEnumerable<string> rwords()
            {
               
                string sql = "SELECT * FROM WORDS";
                string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source= D:\бд\english.mdb";
                using (OleDbConnection connection = new OleDbConnection(connectionString))
                {
                    connection.Open();
                    OleDbCommand command = new OleDbCommand(sql, connection);
                    using (OleDbDataReader dataReader = command.ExecuteReader())
                    {
                        while (dataReader.Read())
                            englw.Add(dataReader["Englwords"].ToString());
                    }
                }
                return englw;
               
            }

    В данном случае в List заносятся слова из столбца. Подскажите пожалуйста, как сделать аналогичное с картинками.

    11 марта 2012 г. 14:17

Ответы

  • Примерно так:

    namespace WindowsFormsApplication
    {
      public partial class Form1 : Form
      {
        private string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"C:\Users\Yatajga\Documents\Visual Studio 2010\Projects\WindowsFormsApplication\WindowsFormsApplication\App_Data\db1.mdb";
        private OleDbConnection connection;
        public Form1()
        {
          connection = new OleDbConnection(connectionString);
          InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
          MemoryStream imageStream;
          connection.Open();
          OleDbCommand command = new OleDbCommand("select * from Tbl", connection);
          command.CommandType = CommandType.Text;
          byte[] imageContent = new byte[0];
          using (OleDbDataReader dataReader = command.ExecuteReader())
          {
            while (dataReader.Read())
            {
              imageContent = (byte[])dataReader["Image"];
              //FileStream fs = new FileStream("123", FileMode.OpenOrCreate, FileAccess.Write);
              //imageStream.Write(imageContent, 0, imageContent.Length);
              imageStream = new MemoryStream(imageContent);
              imageList1.Images.Add(Image.FromStream(imageStream));
            }
          }
         pictureBox1.Image = imageList1.Images[0];
        }
      }
    }
    А в Access тип поля рисунка должен быть - "Поле объекта OLE".

    • Помечено в качестве ответа Nik_A 11 марта 2012 г. 18:26
    11 марта 2012 г. 18:03
    Модератор
  • > Возможно ли добавить в Imagelist картинки, хранящиеся в бд аксесс?
     
     
    byte[] надо загрузить в MemoryStream и создать Bitmap.
    примерно так:
    var res = (byte[]) st.ExecuteScalar();
    var ms = new MemoryStream(res);
    var img = Bitmap.FromStream(ms);
    
     
    см. здесь
     
      
    • Помечено в качестве ответа Nik_A 16 марта 2012 г. 7:57
    15 марта 2012 г. 11:36
  • > может просто занести изображения в imagelist и не париться с бд?
     
       
    вместо access используйте sql server.
    см. здесь (пример для sql server и sql server compact)

      

    • Помечено в качестве ответа Nik_A 18 марта 2012 г. 14:02
    17 марта 2012 г. 19:24

Все ответы

  • Примерно так:

    namespace WindowsFormsApplication
    {
      public partial class Form1 : Form
      {
        private string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"C:\Users\Yatajga\Documents\Visual Studio 2010\Projects\WindowsFormsApplication\WindowsFormsApplication\App_Data\db1.mdb";
        private OleDbConnection connection;
        public Form1()
        {
          connection = new OleDbConnection(connectionString);
          InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
          MemoryStream imageStream;
          connection.Open();
          OleDbCommand command = new OleDbCommand("select * from Tbl", connection);
          command.CommandType = CommandType.Text;
          byte[] imageContent = new byte[0];
          using (OleDbDataReader dataReader = command.ExecuteReader())
          {
            while (dataReader.Read())
            {
              imageContent = (byte[])dataReader["Image"];
              //FileStream fs = new FileStream("123", FileMode.OpenOrCreate, FileAccess.Write);
              //imageStream.Write(imageContent, 0, imageContent.Length);
              imageStream = new MemoryStream(imageContent);
              imageList1.Images.Add(Image.FromStream(imageStream));
            }
          }
         pictureBox1.Image = imageList1.Images[0];
        }
      }
    }
    А в Access тип поля рисунка должен быть - "Поле объекта OLE".

    • Помечено в качестве ответа Nik_A 11 марта 2012 г. 18:26
    11 марта 2012 г. 18:03
    Модератор
  • Спасибо
    11 марта 2012 г. 18:26
  • Спасибо, что не забыли отметить ответ.


    Для связи [mail]

    12 марта 2012 г. 7:33
  • Не удаётся отладить код, такая ошибка появляется:

    15 марта 2012 г. 10:29
  • > Возможно ли добавить в Imagelist картинки, хранящиеся в бд аксесс?
     
     
    byte[] надо загрузить в MemoryStream и создать Bitmap.
    примерно так:
    var res = (byte[]) st.ExecuteScalar();
    var ms = new MemoryStream(res);
    var img = Bitmap.FromStream(ms);
    
     
    см. здесь
     
      
    • Помечено в качестве ответа Nik_A 16 марта 2012 г. 7:57
    15 марта 2012 г. 11:36
  • Такая ошибка появляется скорее всего из-за повреждённого потока, посмотрю в чём дело. Может у вас файл рисунка повреждён?
    15 марта 2012 г. 11:38
    Модератор
  • В аксессе отображается нормально
    15 марта 2012 г. 15:44
  • Да, посмотрел я на файл, сохранённый из потока полученного из access, в HEX редакторе. Сравнил с исходным, и оказывается к некоторым файлам access добавляет какие то двоичные данные, в начале и в конце,(т.е посередине у него данные идентичны исходным, а вот в конце и в начале что то приписано, полное имя файла и другие данные) и от этого скорее всего поток прочесть не удаётся и поэтому и выбрасывается исключение. Попробую понять, что там происходит и напишу.
    15 марта 2012 г. 16:32
    Модератор
  • спасибо за такое внимание к моей проблеме=)
    15 марта 2012 г. 16:44
  • Попробовал сделать аналогично с примером, вот такая ошибка вылезла.

    Привожу код:

     public void pictloader()
            {
                using (var c = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"D:\бд\english.mdb"))
                {
                    c.Open();
                    
                    var bmp = new Bitmap(100, 100);
                    using (var g = Graphics.FromImage(bmp))
                        g.Clear(Color.Red);
                   
                    var ms = new MemoryStream();
                    bmp.Save(ms, ImageFormat.Gif);
                    ms.Position = 0;
                    var st = c.CreateCommand();
                    st.CommandText = "select * from ex2_t1";
                    using (OleDbDataReader dataReader = st.ExecuteReader())
                    {
                        var res = (byte[])dataReader["picture"]; ;
                        ms = new MemoryStream(res);
                        var img = Bitmap.FromStream(ms);
                         
                        var pb = new PictureBox();
                        pb.Image = img;
                        pb.Parent = this;
                        pb.Dock = DockStyle.Right;
                    }
                }

    В таблице: первый столбец ключ, второй "picture" - столбец с изображениями.

    16 марта 2012 г. 7:28
  • Так тоже не получится, так как Access добавляет много лишнего в поток файла, и соответсвенно портится и не читается. Есть два способа решения:

    1. Сделать так чтобы Access в двоичные данные рисунка ничего не добавляла.

    2.Научиться правильно декодировать поток полученный от Access. Но тут сложность в том, что нет определённого стандарта кодирования, скажем вырезать первые n байт с начала и m байт с конца и получить нормальный поток. Так как добавляемая туда информация зависит от имени, местоположения и типа файла, и ещё кое от каких параметров которые пока я не знаю.

    16 марта 2012 г. 8:22
    Модератор
  • Как возможно реализовать первый способ? Ибо второй мне кажется трудновыполнимым.
    16 марта 2012 г. 9:10
  • Ещё думаю, но пока  как-то не получается.

    17 марта 2012 г. 18:41
    Модератор
  • Да я вот думаю - может просто занести изображения в imagelist и не париться с бд?
    17 марта 2012 г. 18:55
  • > может просто занести изображения в imagelist и не париться с бд?
     
       
    вместо access используйте sql server.
    см. здесь (пример для sql server и sql server compact)

      

    • Помечено в качестве ответа Nik_A 18 марта 2012 г. 14:02
    17 марта 2012 г. 19:24
  • С SQL Server проблем точно не будет.
    17 марта 2012 г. 19:33
    Модератор