用 SQL Server 的 FileStream 实现新方式数据库存储文件

作者:vkvi 来源:千一网络(原创) 日期:2016-10-15

附件,有两种存储方式:一是以二进制存储在数据库中,二是存储在文件夹中。

法一优点是好管理,比如便于权限判断,没权限的不能读取附件,缺点是性能低下;法二是性能好,但不方便权限判断(虽然能够做到,但麻烦些)。

有没有结合二者优点的第三种方法呢?有,这在 SQL Server 2008 开始就已经实现了。

第一步、启用 FileStream

在 SQL Server 配置管理器/Configuration Manager 中,在 SQL Server 服务项中,在 SQL Server 上右键,单击属性,切换到 FILESTREAM 标签,勾上“针对 Transact-SQL 访问启用 FILESTREAM”。如下图:

启用 FileStream

第二步、启用文件流访问级别

打开 SQL Server Management Studio,在连接上右键,单击属性,切换到高级标签,文件流访问级别中选择“已启用 Transact-SQL 访问”。如下图:

第二步、启用文件流访问级别

第三步、重启 SQL Server

回到 SQL Server 配置管理器/Configuration Manager 重启 SQL Server 吧。

第四步、创建文件组

如果不用代码,也可在数据库上右键,单击属性,切换到文件组标签,可以看到有“行”、“文件流”两个框,在“文件流”那里添加。

第五步、创建文件

FILESTREAM 数据文件不能指定 SIZE、MAXSIZE 或 FILEGROWTH,所以我们只指定了 NAME、FILENAME 两个 FILE 参数。

在数据库上右键,单击属性,切换到文件标签,可以看到新建的文件的路径一列是:“D:\Cftea”,而不是:“D:\Cftea\FileStreamFile”,这是正常的,因为 FileStreamFile 是 SQL Server 管理的。

第六步、创建表

我们只指定了两个必须字段,实际运用时肯定不止这两个字段。这两个字段,一个是 UNIQUEIDENTIFIER ROWGUIDCOL,另一个是 VARBINARY(MAX) FILESTREAM。

另外,为了我们给 FileId 指定了默认值 newid(),这样就不用我们在代码中为这个列指定值了,由数据库自动生成。

第七步、用 SQL 保存一个文件到数据库中

要注意的是,必须用 Windows 身份认证,不能用 SQL Server 密码,所以连接字符串中用的是:Integrated Security=SSPI;。

保存后,我们可以发现数据库多了一条记录,但真正的文件是存储在 D:\Cftea\FileStreamFile 内部中,我们可以找到一个和 CfteaExample.jpg 一样大小的文件,如果我们把这个文件复制出来,加上扩展名,就可以用图片管理器打开了。

第八步、读取并输出这个图片到网页

第九步、删除文件

CHECKPOINT 很重要,如果漏掉了,就只会删除记录,不会删除文件夹中的文件。

最后

怎么样,要做权限判断(有权限的人能够访问,没权限的人不能访问)就轻松多了吧,而且性能还不错。

你前面那位网友看了:jQuery 的 val 与 ezj 的 val 差别挺大

▲▲▲嘿,欢迎转载传播本站原创文章,尽量保留来源噢。▲▲▲

文章评论
赞助商们
vkvi
vkvi

作者简介: vkvi,致力于 .NET Web 开发、移动开发的技术推广,在 .NET、SQL Server、Windows Server 等方面有深入研究和丰富经验,10 年间共计撰写文章 4000 余篇。 主持金融、国土、农业、电商等多个行业项目执行, 推行“技术提升生产力、人心决定成功率”的管理理论。 联系他