【转】使用SQL Server 2012的FileTable轻松管理文件

一 、FileStream和FileTable介绍

我们经常需要把结构化数据(int、Char等)和非结构化数据(如Varbinary(max))一起存储,那我们在怎么存储的呢?

1、 在SQL Server 2008之前,我们通常在数据库中存储结构化的数据,并且将非结构化数据(例如文档、音频、视频等)存储在NTFS文件系统中,然后在数据库中存放这些文件的路径。但是显而意见,很难保证文件系统和数据库的一致性。

2、 在SQL Server 2008,新增了FileStream,它允许我们将Varbinary(max)类型的文件存放在NTFS文件系统,但是能够直接通过SQL Server管理文件系统中的文件,有效地保证了事务的一致性。但是文件系统只是用来存储文件而已,并不能用来组织和管理文件。

3、 在SQL Server2012,在FileStream的基础之上新增了FileTable,它拥有FileStream的一切功能。并且通过Windows的文件系统能够组织和管理文件,对于文件的一切操作都会反映在SQL Server的文件表中,例如在文件系统中新建文件、新建文件夹、更改文件类型、文件大小等 ,都会相应地在SQL Server的文件表上做相应的操作。

二 、如何配置和使用FileTable

1、 在SQL Server配置管理器中开启文件流访问

a) 勾上“针对Transact-SQL访问启用FileStream”

b) 勾上“启用FileStream进行文件I/O访问”。“Windows共享名(W)”处填入“CanwaySQLFile”

c) 勾上“允许远程客户端访问FileStream数据(R)”

2、 在数据库的实例属性上允许访问文件流

打开“SQL Server Management Studio”,修改该实例的配置。默认配置如下:

将“FileStream访问级别”从“已禁用”改成“已启用完全访问”

其中“FileStream访问级别”有三种可选项:

a) 已禁用

无法将二进制大型对象 (BLOB) 数据存储在文件系统中。此为默认值。即filestream access level=0

b) 已启用 Transact-SQL 访问

可使用 Transact-SQL 访问 FILESTREAM 数据,但不能通过文件系统进行访问。即filestream access level=1

c) 已启用完全访问

FILESTREAM 数据可使用 Transact-SQL 以及通过文件系统进行访问。即filestream access level=0

点击“确定”之后提示必须重启SQL Server服务才会生效:

3、 数据库中添加文件流组和文件

a) 添加文件流组

右键数据库FileTableDB->属性->文件组,在下方的“FileStream”点击“添加”来添加一个文件流组FileStreamGroup。

b) 添加文件

添加了文件流组之后就可以在文件流组中添加数据文件

右键数据库FileTableDB->属性->文件,添加一个名为“FileTable”、文件类型为“FileStream数据”、文件组为“FileStreamGroup”、路径为“E:\FB”的数据库文件。

打开目录“E:\FB”,可以看到自动新建了一个文件夹“FileTable”,在FileTable文件夹下面有一个filestream.hdr文件,它是是FILESTREAM 容器的头文件

4、 数据库启用“非事务访问”和填写“FileStream目录名称”

右键数据库FileTableDB->属性->选项

a) 在“FileStream非事务访问”处选项“Full”

b) 在“FileStream目录名称”处填写“ImageFile”

点击“确定”后提示:

直接点击是就可以了。

5、 创建文件表FileTable

打开SSMS,打开新的查询窗口,输入以下命令并运行

展开数据库FileTableDB,在数据库下有一个名为FileTable的文件夹,展开此文件夹,可以看到一个名为ImageTable2并且拥有很多列的表。

6、 获取共享路径

在数据库FileTableDB下创建文件表ImageTable2之后,就能够通过Windows的资源管理器来看到文件表ImageTable2中存放的文件。

先获取文件表ImageTable2的共享路径,在SSMS下运行以下命令可以得到:

7、 通过共享路径访问数据库FileTableDB下文件表ImageTable2中存放的文件

a) 通过共享路径访问

目前共享文件中没有文件。

b) 查询ImageTable2

目录表ImageTable2也是空的

c) 在Windows资源管理器上打开上面的共享目录

i. 新建一个名为“Test.txt”的文件

然后再查询表ImageTable2

(后面还有其它字段,截图没截到)

可以发现,在共享目录下创建一个文件,那么在表ImageTable2下也会自动添加一条记录。

ii. 同样地,在数据库中删除表ImageTable2下的记录也会相应地自动删除共享目录下的文件。

iii. 在共享目录下创建文件夹也会自动地在文件表中创建一个文件夹

iv. 共享目录下修改文件的名字、增加文件的内容、更改文件的类型等都会自动地在数据库的ImageTable2下做相应的更改。

三 、总结

通过SQL Server 2012的FileTable,我们可以很方便地组织和管理存放在数据库中的文件。可以通过文件系统直接为文件建立多级目录进行分类管理,可以修改文件类型,修改文件名等,这些都不会影响到数据库和文件系统的一致性。

转载于:https://www.cnblogs.com/chenshao/p/4108678.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于实现文件发送与保存工具,您可以使用WinForms作为界面开发框架,同时使用SQL Server作为数据库存储文件相关的信息。下面是一个简单的实现示例: 1. 创建WinForms应用程序项目,并添加所需的界面元素,如文件选择按钮、发送按钮、保存按钮等。 2. 在数据库中创建一个表,用于存储文件信息,可以包含字段如文件名、文件路径、发送时间等。 3. 在应用程序中,使用ADO.NET连接到SQL Server数据库。 4. 当用户选择文件后,将文件信息插入到数据库表中。您可以在发送按钮的点击事件中执行以下代码: ```csharp private void btnSend_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { string fileName = Path.GetFileName(openFileDialog.FileName); string filePath = openFileDialog.FileName; DateTime sendTime = DateTime.Now; // 使用ADO.NET连接到数据库,执行插入操作 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand("INSERT INTO FileTable (FileName, FilePath, SendTime) VALUES (@FileName, @FilePath, @SendTime)", connection); command.Parameters.AddWithValue("@FileName", fileName); command.Parameters.AddWithValue("@FilePath", filePath); command.Parameters.AddWithValue("@SendTime", sendTime); command.ExecuteNonQuery(); } // 其他操作,如发送文件到目标地址 } } ``` 5. 当用户点击保存按钮时,从数据库中读取文件信息,并将文件保存到指定位置。您可以在保存按钮的点击事件中执行以下代码: ```csharp private void btnSave_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); if (saveFileDialog.ShowDialog() == DialogResult.OK) { // 从数据库中读取文件信息 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand("SELECT FileName, FilePath FROM FileTable", connection); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { string fileName = reader.GetString(0); string filePath = reader.GetString(1); // 将文件保存到指定位置 File.Copy(filePath, Path.Combine(saveFileDialog.FileName, fileName)); } } } } ``` 请注意,上述代码仅为示例,您可能需要根据实际需求对其进行修改和完善。此外,还需要在应用程序中处理异常、数据库连接等相关逻辑。 希望以上信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值