Загрузка нескольких больших двоичных объектов из базы данных sql в ListView на C#

#c# #sql #winforms #listview #blob

#c# #sql #winforms #listview #большой двоичный объект

Вопрос:

Я пытаюсь загрузить некоторые BLOB-файлы (несколько случайных изображений) в ListView на C #. Я могу прочитать одно изображение из базы данных, если использую оператор select, подобный этому:

Например, «Выберите изображение из изображения, где id = 1».

Но как я могу прочитать все изображения из базы данных? Я пробовал этот код:

 public List<Bitmap> fetchPictures()
        {
            List<Bitmap> mPictures = new List<Bitmap>();
            DataTable dt;
            sql = "SELECT picture FROM Picture";

                using (var cmd = new MySqlCommand(sql, conn))
                {
                    //cmd.Parameters.AddWithValue("@ID", 6);
                    DataSet ds = new DataSet();
                    byte[] MyData = new byte[0];
                    MySqlDataAdapter da = new MySqlDataAdapter(cmd);

                    da.Fill(ds, "Picture");
                    dt = ds.Tables["Picture"];
                    DataRow myRow;

                    MemoryStream mStream = new MemoryStream();

                    for (int i = 0; i < dt.Rows.Count; i  )
                    {
                        myRow = dt.Rows[i];
                        MyData = (byte[])myRow["Picture"];
                        mStream.Write(MyData, 0, Convert.ToInt32(MyData.Length));
                        mPictures.Add(new Bitmap(mStream, false));
                    }

                    mStream.Dispose();
                    return mPictures;
                }

        }
  

Как вы можете видеть, я пытаюсь прочитать все изображения и затем добавить их в список растровых изображений. В настоящее время база данных заполнена двумя разными изображениями. Если я запускаю программу, в ListView отображаются два изображения, но оба они являются первым изображением базы данных. Итак, я думаю, проблема должна быть в этом методе.

Я ценю вашу помощь.

Ответ №1:

Попробуйте изменить свой код, чтобы иметь это

 for (int i = 0; i < dt.Rows.Count; i  )
{
    using (MemoryStream mStream = new MemoryStream())
    {
        myRow = dt.Rows[i];
        MyData = (byte[])myRow["Picture"];
        mStream.Write(MyData, 0, Convert.ToInt32(MyData.Length));
        mPictures.Add(new Bitmap(mStream, false));
    }
}
  

Я думаю, что ваш поток все еще может начинаться с первого изображения

Комментарии:

1. Для меня это сработало отлично! Но я действительно не понимаю, в чем была проблема. Не могли бы вы объяснить это мне?

2. Вы объявили свой поток вне for-цикла. И он продолжал добавлять больше данных. Итак, когда вы это сделали new Bitmap(mStream, false) , фактически были загружены оба растровых изображения во второй строке, но вы увидели только 1. Теперь вы создаете один поток для каждого растрового изображения.

3. О, хорошо. Большое вам спасибо за вашу помощь!! =)

4. Нет проблем — наслаждайтесь кодированием