Dapper如何处理SQL Server中的FileStream Dapper文件流数据操作

煙雲
发布: 2025-12-15 01:51:05
原创
947人浏览过
Dapper 不直接支持 SQL Server 的 FILESTREAM 功能,需配合 ADO.NET 使用 SqlFileStream 或 varbinary(max) 参数完成读写;它仅负责参数传递与结果映射,FILESTREAM 的流操作、事务控制和路径管理须手动实现。

dapper如何处理sql server中的filestream dapper文件流数据操作

Dapper 本身不直接支持 SQL Server 的 FILESTREAM 功能,但它可以配合 ADO.NET 原生能力完成 FileStream 数据的读写操作。关键在于:Dapper 负责参数传递和结果映射,而 FILESTREAM 的二进制流处理需通过 SqlFileStream 或常规 varbinary(max) 参数方式实现。

理解 FILESTREAM 在 Dapper 中的角色定位

SQL Server 的 FILESTREAM 是将大文件(如图片、文档)存储在 NTFS 文件系统中,同时在数据库中保留指向该文件的指针(uniqueidentifier)。Dapper 不提供对 SqlFileStream 类的封装,也不自动识别 varbinary(max) FILESTREAM 列——它只把列当作普通二进制字段处理。因此你需要手动控制流的打开、读写和关闭逻辑。

  • 插入/更新时,若想启用 FILESTREAM 存储,必须确保表已启用 FILESTREAM,并且对应列为 varbinary(max) FILESTREAM
  • Dapper 可以传入 byte[]Stream(需配合自定义 IDbCommand 设置)作为参数,但底层仍依赖 ADO.NET 的 SqlParameter 配置
  • 查询 FILESTREAM 列时,Dapper 默认返回 byte[];若数据很大,建议改用 SqlFileStream 按需读取,避免内存爆炸

插入 FILESTREAM 数据(带事务与路径获取)

插入 FILESTREAM 数据需要两步:先插入一条记录获取 FILESTREAM 路径(即 PathName()),再用该路径创建 SqlFileStream 写入内容。Dapper 可用于执行这两步 SQL,但流操作要自己写。

  • 第一步:用 Dapper 插入空记录(FILESTREAM 列为 0xNULL),并返回 ROWGUID 或主键
  • 第二步:调用 SELECT [FileColumn].PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() 获取路径和上下文
  • 第三步:在同一个事务中,用 new SqlFileStream(path, context, FileAccess.Write) 写入原始字节

注意:整个过程必须在显式开启的 SqlTransaction 中进行,且 Dapper 的 Execute / QuerySingle 方法需传入该事务对象。

赣极购物商城网店建站软件系统
赣极购物商城网店建站软件系统

大小仅1兆左右 ,足够轻便的商城系统; 易部署,上传空间即可用,安全,稳定; 容易操作,登陆后台就可设置装饰网站; 并且使用异步技术处理网站数据,表现更具美感。 前台呈现页面,兼容主流浏览器,DIV+CSS页面设计; 如果您有一定的网页设计基础,还可以进行简易的样式修改,二次开发, 发布新样式,调整网站结构,只需修改css目录中的css.css文件即可。 商城网站完全独立,网站源码随时可供您下载

赣极购物商城网店建站软件系统 3
查看详情 赣极购物商城网店建站软件系统

读取 FILESTREAM 数据(避免全量加载)

直接用 Dapper 查询 FILESTREAM 列会把整个文件加载进内存(如 conn.QuerySingle<byte>(sql)</byte>),不适合大文件。推荐方式是只查出路径和上下文,再用 SqlFileStream 流式读取。

  • 用 Dapper 执行 SELECT FileData.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() 得到流信息
  • SqlTransaction 内创建 SqlFileStream,然后用 CopyTo 或分块 Read 输出到响应流、文件或内存缓冲区
  • 务必在使用后调用 stream.Close(),否则 SQL Server 可能锁住文件句柄

替代方案:用 varbinary(max) 绕过 FILESTREAM(适合中小文件)

如果文件普遍小于 1–2 MB,可放弃 FILESTREAM,直接用标准 varbinary(max) 列 + Dapper 简化操作:

  • 插入:conn.Execute("INSERT INTO Docs (Name, Content) VALUES (@name, @content)", new { name = "a.pdf", content = File.ReadAllBytes(path) })
  • 读取:byte[] data = conn.QuerySingle<byte>("SELECT Content FROM Docs WHERE Id = @id", new { id = 123 })</byte>
  • 优点是零额外依赖、事务透明、Dapper 完全兼容;缺点是数据库体积增长快、备份变重

基本上就这些。Dapper 不是 FILESTREAM 的“开关”,而是你操作数据库的轻量管道——FILESTREAM 的复杂性仍在 ADO.NET 层,Dapper 只帮你更干净地拼 SQL 和传参。

以上就是Dapper如何处理SQL Server中的FileStream Dapper文件流数据操作的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号