首页 > 数据库技术 > 详细

SQL Server FileStream

时间:2015-12-23 19:23:30      阅读:215      评论:0      收藏:0      [点我收藏+]

  以往我们对文件管理有两种方法:

  1. 数据库只保存文件的路径,具体的文件保存在文件服务器(NFS)上,使用时,编程实现从文件服务器读取文件;
  2. 将文件直接以varbinary(max)或image数据类型保存在数据库中。

  上面两种文件存放方式都有问题:第一种方法因为会访问磁盘,故受I/O影响性能不是很好,而且不能很好的进行文件备份;第二种方法虽然解决了文件备份(数据库的备份)问题,但是由于字段的字节数太大,对数据库本身也会造成影响,性能也很低下。

  微软在SQL Server 2008推出了一种新的方式 - FileStream,它不是一种新的数据类型,而是一种技术,它使SQL Server数据库引擎和NTFS文件系统成为了一个整体,它结合了上面两种方式的优点:FileStream使用NT系统来缓存文件数据,而对文件数据的操作可使用Transact-SQL语句对其进行插入、更新、查询、搜索和备份。

 

一、FileStream配置

  1. 配置SQL Server安装实例:Start -> All Programs -> Microsoft SQL Server 2008 R2 -> Configuration Tools -> SQL Server Configuration Manager

技术分享

  右击属性,切换到FILESTREAM标签,勾选如下配置

技术分享

  2. 打开SQL Server,并配置如下

技术分享

   以上也可以通过如下脚本执行:

Exec sp_configure filesteam_access_level, 2
RECONFIGURE

  最后重启SQL Server Service

技术分享

二、实例展示

  创建FileStream类型文件/组

--Create filestreamgroup 
ALTER DATABASE [Archive]
ADD FILEGROUP [FileStreamGroup] CONTAINS FILESTREAM 
GO

--Create filestream and association with filestreamgroup above
ALTER DATABASE [Archive]
ADD FILE ( NAME = NFileStream, FILENAME = ND:\Company\Data\SQL Server\FileStream) TO FILEGROUP [FileStreamGroup]
GO

技术分享

  创建测试表(注意:如果表包含FILESTREAM列,则每一行都必须具有唯一的行ID)

--Create table
CREATE TABLE Archive.dbo.Attachment (
    [ID] [UNIQUEIDENTIFIER] ROWGUIDCOL NOT NULL PRIMARY KEY,
    [FileName] NVARCHAR(100) NULL,
    [CreateUser] NVARCHAR(100) NULL,
    [CreateDatetime] DATETIME NULL,
    [Content] VARBINARY(MAX) FILESTREAM NULL  
)
FILESTREAM_ON [FileStreamGroup] 

  插入一些测试数据

--Insert some records
INSERT INTO Attachment VALUES 
(NEWID(),File Name 1,shg.cpan, GETDATE(),NULL),
(NEWID(),File Name 1,shg.cpan, GETDATE(),CAST(‘‘ AS VARBINARY(MAX))),
(NEWID(),File Name 1,shg.cpan, GETDATE(),CAST(This is a attachment, which contains all introduction for filestream AS VARBINARY(MAX)))

  从前台插入一些数据

using (SqlConnection conn = new SqlConnection("server=10.7.15.172;database=Archive;uid=sa;pwd=1234;Connect Timeout=180"))
{
    conn.Open();
    using (SqlCommand cmd = conn.CreateCommand())
    {
        string id = Guid.NewGuid().ToString();
        cmd.CommandText = "INSERT INTO Attachment VALUES(‘" + id + "‘,‘File Name 2‘,‘shg.cpan‘,‘" + DateTime.Now + "‘,@content)";
        SqlParameter param = new SqlParameter("@content", SqlDbType.VarBinary, 1000000000);
        param.Value = File.ReadAllBytes(@"D:\Folder\131 u_ex151207.log");
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
    conn.Close();
}

  检索数据 

SELECT DATALENGTH(CONTENT)/(1024.0 * 1024.0) AS MB,* FROM ATTACHMENT

  结果

技术分享

  文件系统

技术分享  

  上面的文件都是上传的真实文件,只不过没有后缀,如果重命名加上后缀,即可读取,如最后一个是excel文件,加上.xls,即可用Excel软件打开此文件

 

三、注意事项

  请注意以下事项:

  • 并不是所有的文件存储都适合使用FileStream,如果所存储的文件对象平均大于1MB考虑使用FileStream,否则对于较小的文件对象,以varbinary(max)BLOB存储在数据库中通常会提供更为优异的流性能;
  • FileStream可以使用在故障集群上(Failover Cluster),但此时FileStream文件组必须位于共享磁盘资源上;
  • FILESTREAM 与其他 SQL Server 功能的兼容性:https://msdn.microsoft.com/zh-cn/library/bb895334(v=sql.105).aspx

  参考文章

  How to: Enable FILESTREAM https://msdn.microsoft.com/en-us/library/cc645923(v=sql.105).aspx

  http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/03/filestream-configuration-and-setup-changes-in-sql-server-2008-february-ctp.aspx

  

 

SQL Server FileStream

原文:http://www.cnblogs.com/panchunting/p/SQLServer_FileStream.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!