检索 Sql FileStream 文件

4
我们有超过200GB的数据存储在SQL文件流数据库中。所以,有人能建议一下最好、最快的方式来提取文件流文件吗?
我计划使用C#应用程序逐个循环提取文件。是否还有其他方法可用?或者你们知道如何使用C#快速提取文件吗?
提前感谢。

你是要将它们提取出来放到其他地方吗?还是你的程序真的需要一遍又一遍地重复提取所有文件,一个接一个地提取? - Aaron Bertrand
是的,我们需要逐个从数据库中提取文件并将它们存储在一个文件夹中。(实际上,我们需要将所有提取的文件移动到Amazon S3。) - user972255
你需要代码比你已经拥有的慢解决方案快多少?(我假设你计划展示带有测量时间的示例代码,以便人们可以提出改进建议) - Alexei Levenkov
目前我有普通的C#代码来从文件流中获取文件(这是每个人都在使用的通用代码)。 - user972255
1个回答

2
如果您正在提取大量文件(在这种情况下似乎是如此),并且可以访问SQL服务器机器,则可以直接从磁盘上的文件夹中复制所有文件。
这取决于版本,但是您可能会在此处找到SQL Server 2008的文件:
C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA

这将包含所有以GUID命名的文件,您可以通过查看C#应用程序中的数据库表将其重命名为更易读的名称。
如果您无法访问SQL服务器,则远程读取它们并保存每个文件可能是最好的方法。只需确保带宽足够,并检查并行运行查询是否会提高速度。
更多信息请参见此链接:http://www.codeproject.com/Articles/128657/How-Do-I-Use-SQL-File-Stream

我不理解你所说的从磁盘文件夹复制所有文件的意思。在我看来,SQL文件流文件是加密的并存储在SQL服务器中(如果我错了请纠正我),我们需要使用一些程序/API来检索文件(在我的情况下是C#)。 - user972255
我不认为它们在本地磁盘上被加密了。假设您有关于文件类型的一些信息,您应该能够像在 SQL 服务器机器上打开普通文件一样打开它们。 - Lummo
如果使用FileStream将文件保存在数据库中是可能的。实际上,数据库只是创建一个字典来维护这些文件,当然是在事务中维护它们。但是,如果停止SQL Server服务,您可以像处理常规文件一样操作文件。 - ljh
@ljh:好的,但我们怎么知道哪个文件属于什么?我的意思是,文件流文件夹中的文件似乎都不同,并且没有像.pdf、.xls等扩展名。如何识别它们? - user972255
我从微软网站上得到了这个信息:“存储在FILESTREAM列中的单个文件无法直接从NTFS文件系统中打开。流式传输FILESTREAM数据仅在SQL Server事务的上下文中起作用。”请参阅http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlfilestream.aspx。 - user972255
@user972255:请查看我在“文件实际存储位置”下面链接的codeproject文章,您可以看到文件可以直接从文件系统中打开。您可以查看数据库中的表格,将filestream GUID与文件名和扩展名匹配起来。这似乎并不是Microsoft推荐的方法,但它似乎是可行的。如果您不想采用这种方法,那么只需使用SQL逐个获取每个文件,但您最初是追求最快的方法。 - Lummo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接