首页 > 解决方案 > 从 sql 数据库中选择所有照片

问题描述

我想将我们数据库中的所有照片导出到数据表中。然后我将遍历表格并将每个图像保存到磁盘。大约有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;
    }

标签: c#sql

解决方案


如果您的意图是将图像保存到磁盘,那么为什么要将它们放入中间数据表中?如果您在读取它们时直接写入磁盘会不会更好?如果是这样,假设这些是 .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();
    }
}

推荐阅读