关于这个问题的背景, 查看现在有一个大的 “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的原因。
答案 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)