Dapper 不直接支持 SQL Server 的 FILESTREAM 功能,需配合 ADO.NET 使用 SqlFileStream 或 varbinary(max) 参数完成读写;它仅负责参数传递与结果映射,FILESTREAM 的流操作、事务控制和路径管理须手动实现。

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 列为
0x或NULL),并返回ROWGUID或主键 - 第二步:调用
SELECT [FileColumn].PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT()获取路径和上下文 - 第三步:在同一个事务中,用
new SqlFileStream(path, context, FileAccess.Write)写入原始字节流
注意:整个过程必须在显式开启的 SqlTransaction 中进行,且 Dapper 的 Execute / QuerySingle 方法需传入该事务对象。
标签: app 字节 access pdf stream .net
还木有评论哦,快来抢沙发吧~