是否有类似SqlFileStream的类与Sql Server 2005一起使用?

时间:2010-01-22 09:37:39

标签: .net sql-server ado.net

  

关于这个问题的背景,   查看现在有一个大的 “How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer?”   赏金。

SqlFileStream为您提供了IoStream,它位于存储在数据库中的blob(varbinary)值之上。但是由于SqlFileStream实现的限制,它只适用于Sql Server 2008。

逻辑上我看不出为什么在Sql Server 2000和Sql Server 2005上无法提供某些API的原因。

  • 有人知道这是否已经完成?
  • 在任何地方都有开源实现吗?
  • 我认为应该可以做什么?

3 个答案:

答案 0 :(得分:2)

除了SQL Server 2008之外,我不知道SqlFileStream类。我怀疑这完全取决于SqlFileStream类是专门为“坐在上面”而设计的。 SQL Server 2008中的FILESTREAM类型的列。

FILESTREAM column/datatype仅在SQL Server 2008中可用,并且基本上允许在此列中存储大量数据。 FILESTREAM列实际上是varbinary(max)列,其FILESTREAM修饰符。这实际上导致SQL Server有效地绕过RDBMS存储子系统并将二进制数据直接存储在底层NTFS文件系统上,从RDBMS角度维护此数据的事务完整性。

MSDN article如此陈述:

  

指定FILESTREAM属性   varbinary(max)列导致SQL   服务器将数据存储在本地   NTFS文件系统而不是   数据库文件。 Transact-SQL语句   提供数据处理功能   在服务器和Win32文件中   系统接口提供流媒体   访问数据。

FILESTREAM Data in SQL Server 2008 MSDN文章还指出:

  

SqlFileStream API适用于   SQL Server事务的上下文。

但是那个:

  

SqlFileStream继承自   System.IO.Stream类,提供   阅读和写作的方法   数据流。从溪流中读取   将数据从流传输到   数据结构,例如数组   字节。写入传输数据   将数据结构转换为流。

建议在内部,SqlFileStream以与“bog-standard”FileStream class

相同的方式运行

但是,对于为什么此功能在SQL Server的早期版本(未实现任何类型的FILESTREAM或“直接到底层存储”列类型)中不可用的最明确的细节可能来自{ {3}} MSDN文章声明:

  

FILESTREAM集成了SQL Server   带有NTFS文件的数据库引擎   存储varbinary(max)的系统   二进制大对象(BLOB)数据为   文件系统上的文件。的Transact-SQL   语句可以插入,更新,查询,   搜索并备份FILESTREAM数据。   Win32文件系统接口提供   流式访问数据。

     

FILESTREAM使用NT系统缓存来缓存文件数据。这有帮助   减少FILESTREAM数据的任何影响   可能在数据库引擎上   性能。 SQL Server缓冲区   没有使用游泳池;因此,这   内存可供查询   处理

这基本上说使用SqlFileStream对象几乎与“标准”FileStream对象的行为相同,只是SQL Server(出于事务完整性目的)将充当一个非常轻量级的“看门人”(或“包装器”)供您阅读并且将二进制数据写入底层NTFS文件系统文件。由于没有以前版本的SQL Server提供此类功能并与底层NTFS文件系统直接集成,我会说不可能针对任何实现SqlFileStream SQL Server 2008之前的SQL Server版本。(至少没有一个具有相同的“写入文件,但维护RDBMS事务完整性”功能)。

答案 1 :(得分:0)

FILESTREAM数据类型是在SQL Server 2008中引入的,在SQL Server 2005中没有等效类型。此数据类型的处理方式与“普通”blob类型不同。 FILESTREAM数据作为文件单独保存到数据库,而blob(text或varchar(max)等)直接保存在数据页中。因此,您可以在SQL 2008中使用SqlFileStream来传输文件的内容,但是要读取blob,db引擎必须将它们加载到服务器内存中并作为整体返回到客户端。因此,不可能将SqlFileStream直接附加到SQL 2005中的blob列。

答案 2 :(得分:0)