小编Gei*_*sen的帖子

在使用SqlDataReader时,如何在普通的旧C#对象中使用BLOB创建流?

这是场景:

  • 我们在MSSQL数据库中的blob中存储文件,例如相对较大的文档(10-300MB).
  • 我们有一个非常小的域模型,所以我们使用干净的SqlDataReader方法为我们的存储库而不是ORM,以避免不必要的依赖.
  • 我们希望在ASP.NET/ASP.NET MVC网页上使用服务器上下文中的对象.
  • 我们不想在byte []中临时存储blob,以避免服务器上的高内存使用

所以我一直在做的是实现我自己的SqlBlobReader.它继承了Stream和IDisposable,在实例化过程中,我们必须提供一个包含查询的SqlCommand,该查询返回一行包含一列,当然这是我们想要流的blob.然后我的C#域对象可以具有Stream类型的属性,该属性返回SqlBlobReader实现.然后,当流式传输到ASP.net MVC等中的FileContentStream时,可以使用此流.

它将立即使用SequentialAccess执行ExecuteReader,以启用来自MSSQL服务器的blob流.这意味着我们必须小心在使用它时尽快处理流,并且在需要时我们总是懒惰地实例化SqlBlobReader,例如在我们的域对象中使用存储库调用.

我的问题是:

  • 当使用SqlDataReader而不是ORM时,这是在普通旧域对象上实现blob流的聪明方法吗?
  • 我不是ADO.NET专家,实现看起来合理吗?

SqlBlobReader.cs:

using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;

namespace Foo
{
   /// <summary>
   /// There must be a SqlConnection that works inside the SqlCommand. Remember to dispose of the object after usage.
   /// </summary>
   public class SqlBlobReader : Stream
   {
      private readonly SqlCommand command;
      private readonly SqlDataReader dataReader;
      private bool disposed = false;
      private long currentPosition = 0;

      /// <summary>
      /// Constructor
      /// </summary>
      /// <param …
Run Code Online (Sandbox Code Playgroud)

.net c# sqldatareader stream

9
推荐指数
1
解决办法
3848
查看次数

标签 统计

.net ×1

c# ×1

sqldatareader ×1

stream ×1