c# - 从 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;
}
解决方案
如果您的意图是将图像保存到磁盘,那么为什么要将它们放入中间数据表中?如果您在读取它们时直接写入磁盘会不会更好?如果是这样,假设这些是 .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();
}
}
推荐阅读
- javascript - 如何在 React js 中编辑本地存储中的数组数据
- java - 如何制作用户可以选择使用哪个选项的程序?
- spring-boot - 包含西里尔字母的附件名称在 gmail 中以加密形式显示
- sql - 如何在 SQL Server 中查找特定字符串的多次出现并获取值
- excel - Excel VBA 数组列排序
- python - 为什么这个函数会影响一个甚至没有传递给它的变量?
- postgresql - postgresql 从两行创建一行
- vuejs2 - 如何将活动类添加到特定 div
- ruby-on-rails - 如何使用 curl 发布而不收到 HTTP 错误 422 'Unprocessable Entity'?
- vba - Word 宏:从文件夹导入/格式化图像并删除多余的页面