【问题标题】:Streaming in and out of an SQL Server 2005 image field with C#?使用 C# 流入和流出 SQL Server 2005 图像字段?
【发布时间】:2009-12-03 21:29:43
【问题描述】:

在广泛检查了这个问题的答案后,我仍然找不到令人满意的解决方案。就这样吧。

我需要在 SQL Server 2005 表的列中存储可能大量的数据。我绝对需要以流媒体方式工作,这样:

  1. 写入时,数据以块的形式发送到数据库。是否有一些内置方法可以使用 System.Data.SqlClient 中的类从 C# 客户端代码中实现这一点?还是我需要求助于使用 ADODB.Net Stream 对象?不确定如何混合这两个概念(尤其是关于参与当前的 SqlTransaction。

另外,T-SQL 存储过程有没有办法将数据追加到现有列。使用这种方法,存储过程将被客户端代码多次调用,这将达到流式传输的要求。

  1. 读取时,应以流方式一次读取一个数据块。

另外,T-SQL 存储过程是否有办法提供对图像字段内容的顺序甚至随机访问?

【问题讨论】:

  • SQL Server 2008 和 VARBINARY(MAX) 字段的 FILESTREAM 属性提供了这种功能 - 我不认为 SQL Server 2005 有类似的功能:-(
  • 是的,你是对的。我害怕意识到这一点。然后我采用了下面我自己的答案中描述的解决方案。

标签: sql-server-2005 streaming blob


【解决方案1】:

其实有办法的,就是有点疼。

SQL Server 2005 支持更新列的一部分: http://technet.microsoft.com/en-us/library/ms177523(SQL.90).aspx

您可以使用子字符串读取列的一部分(是的,甚至是二进制的 - 它会愉快地返回一个字节数组)。

这里需要注意的是它只是一个更新 - 所以你必须先在 varbinary(max) 字段中创建一个值,然后再更新它。除此之外,绝对有可能将数据流式传输到 SQL Server 或从 SQL Server 传输数据。我用流类包装了检索/更新功能,让我的生活更轻松。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    好吧,回答我自己的问题。

    事实是......实际上没有方法可以做我想做的事。来自纯客户端代码或来自 T-SQL 中的服务器端存储过程。在我们切换到 SQL Server 2008 之前,我们将不得不寻找另一个解决方案。

    然而,其实有一种方法可以模拟这种行为,从而达到流式传输的要求。解决方案在于客户端和服务器代码之间的协作。

    例如,服务器数据库应该将要流式传输的全部内容公开为 fragments 表中的一组记录。每条记录,代表要流式传输的全部内容的一部分。而在客户端,按顺序读取流,然后将每个块发送到数据库以填充一条记录。

    通过适当的簿记,还可以以流式方式读取存储的数据。

    顺便说一句,这就是 Microsoft BizTalk Server 正在做的事情,这就是我发现的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多