c# - 如何在 dot net 标准应用程序中使用 Dapper 从数据库中读取块中的文件
问题描述
我为存储文件的中心位置创建了一个点网标准应用程序。我已经设法以块的形式上传文件,因为基本上我让客户端发送块并将它们作为流附加到数据库中,但是当我想返回时问题就来了,从块中检索文件数据库(可能有几个 sql 查询)而不是一次发送。有可能使用 SqlFileStream 来完成,但在 dot net 标准应用程序中是不可能的,因此我正在寻求一些使用 Dapper 阅读器的解决方案可能是?在这里找到了一些示例代码 - https://stackoverflow.com/a/2101447但我不确定我是否可以用 dapper 做到这一点。每一个提议都非常感谢。
解决方案
通过传递 Stream 找到了这个解决方案。基本上使用来自客户端 asp.net mvc 的 Respose.Body 流并直接修改它而不返回任何数据。因此,文件 get 开始直接向客户端发送块,而不使用整个服务器内存(一次仅指定 1mb)。
var sql = $@"
SELECT [Data]
FROM {TableName}
WHERE ChunkId = @chunkId";
using (var conn = this.dbConnectionFactory.GetSqlConnection)
using (var reader = await conn.ExecuteReaderAsync(sql, new { chunkId }).ConfigureAwait(false))
{
while (reader.Read())
{
var buffer = new byte[1024 * 1024]; // Read chunks of 1MB
var bytesRead = 0L;
var dataIndex = 0L;
while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0)
{
var actual = new byte[bytesRead];
Array.Copy(buffer, 0, actual, 0, bytesRead);
await stream.WriteAsync(actual, 0, (int)bytesRead).ConfigureAwait(false);
dataIndex += bytesRead;
}
}
}
推荐阅读
- node.js - 是否可以使用 Node 工作线程来执行数据库插入?
- python - if语句python中的np.linspace
- python - 如何将列中的浮点数更改为字符串 pandas
- asp.net-core - Identity Server 3 没有保留身份验证 cookie
- raku - 在第一个“once {next}”块之后,其他相同范围的“once”块无法执行
- javascript - 从嵌套父级的父组件更改道具
- python - R包teradatasql dbGetQuery永远返回更大的数据,而python工作得非常快
- javascript - 我怎样才能使这个轮播与 JS 和 CSS 一起工作?
- list - SwiftUI 从列表中编辑结构
- java - Firebase 图像检索 Android studio