выбор всех фотографий из базы данных sql - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу экспортировать все фотографии из нашей базы данных в таблицу данных.Затем я переберу таблицу и сохраню каждое изображение на диск.Есть около 7000 фотографий.

Когда я запускаю процесс, я могу получить около 4000 фотографий, прежде чем я начну получать сообщения об ошибках, такие как, Исключение типа 'System.OutOfMemoryException'.

Если я изменю SQL-запрос наизвлеките вдвое меньше фотографий, скажем 3500, затем процесс завершится успешно.Хотя теперь я добился того, чего хотел, изменяя SQL каждый раз, когда запускаю код, я хотел бы улучшить свой код, чтобы возвращались все 7000 фотографий.Может ли кто-нибудь, пожалуйста, посоветовать лучший процесс.

Вот мой метод

 public static DataTable GetAllPhotos()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("personId", typeof(string));
        dt.Columns.Add("Photo", typeof(Bitmap));

        string SQL = "";
        byte[] getImg = new byte[0];
        byte[] BitmapImg = new byte[0];
        string personId = "";
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = _connString;

        SQL = @"select per.person_id,pho.photo
                from person as per
                left join photo as pho on per.photo_id = pho.photo_id
                where photo is not null";


        conn.Open();
        SqlDataReader dr = null;
        SqlCommand cmd = new SqlCommand(SQL, conn);
        dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            try
            {
                getImg = (byte[])dr["Photo"];
                personId = Convert.ToString(dr["person_id"]);
                MemoryStream str = new MemoryStream(getImg);
                Bitmap bitmap = new Bitmap(Image.FromStream(str));
                BitmapImg = ImageToByte(bitmap);

                dt.Rows.Add(personId, bitmap);
            }
            catch (Exception ex)
            {

                LogWriter.WriteLine(personId + ex.Message.ToString());
            }


        }

        conn.Close();
        return dt;
    }

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Если ваше намерение заключается в сохранении изображений на диск, то зачем вам их промежуточные данные?Разве не было бы лучше, если бы вы непосредственно записывали на диск, когда читаете их?Если это так, предположим, что это файлы .bmp:

public static void DumpAllPhotos()
{
    string sql = @"select per.person_id,pho.photo
                from person as per
                inner join photo as pho on per.photo_id = pho.photo_id";
    string folder = @"c:\MyFolder"; // output folder
    using (SqlConnection con = new SqlConnection(_connString))
    using (SqlCommand cmd = new SqlCommand(sql,con))
    {
        con.Open();
        var rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            var bytes = (byte[])rdr["photo"];
            var path = Path.Combine(folder, $"{rdr["person_id"].ToString()}.bmp");
            File.WriteAllBytes(path, bytes);
        }
        con.Close();
    }
}
0 голосов
/ 24 сентября 2019

Растровое изображение должно быть удалено, вы используете слишком много ручек.Так что ваш цикл while должен выглядеть примерно так:

 while (dr.Read())
    {
        try
        {
            getImg = (byte[])dr["Photograph"];
            personId = Convert.ToString(dr["person_id"]);
            MemoryStream str = new MemoryStream(getImg);
            Bitmap bitmap = new Bitmap(Image.FromStream(str));
            BitmapImg = ImageToByte(bitmap);

            dt.Rows.Add(personId, bitmap);
            bitmap.Dipose(); // <--- DISPOSE!!
        }
        catch (Exception ex)
        {

            LogWriter.WriteLine(personId + ex.Message.ToString());
        }
    }

или, может быть, даже лучше:

 while (dr.Read())
    {
        try
        {
            getImg = (byte[])dr["Photograph"];
            personId = Convert.ToString(dr["person_id"]);
            MemoryStream str = new MemoryStream(getImg);
            using (Bitmap bitmap = new Bitmap(Image.FromStream(str))) {
                BitmapImg = ImageToByte(bitmap);
                dt.Rows.Add(personId, bitmap);
           }
        }
        catch (Exception ex)
        {

            LogWriter.WriteLine(personId + ex.Message.ToString());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...