- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SQL Server FileStream详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
FILESTREAM是SQL Server 2008中的一个新特性,允许以独立文件的形式存放大对象数据,而不是以往一样将所有数据都保存到数据文件中。以往在对业务系统的文件进行管理时有两种方法,一种是将文件保存到服务器文件系统中,数据库中只保存了该文件的路径,在使用该文件时应用程序连接到服务器读取文件;另一种是将文件以varbinary(max)或image数据类型保存到SQL Server中。而SQL Server 2008提供了FILESTREAM,结合这两种方式的优点.
FILESTREAM使SQL Server数据库引擎和NTFS文件系统成为了一个整体。Transact-SQL语句可以插入、更新、查询、搜索和备份FILESTREAM数据。FILESTREAM使用NT系统缓存来缓存文件数据。这有助于减少FILESTREAM数据可能对数据库引擎性能产生的任何影响。由于没有使用SQL Server缓冲池,因此该内存可用于查询处理.
以往我们对文件管理有两种方法:
1.数据库只保存文件的路径,具体的文件保存在文件服务器(NFS)上,使用时,编程实现从文件服务器读取文件; 。
2.将文件直接以varbinary(max)或image数据类型保存在数据库中.
上面两种文件存放方式都有问题:第一种方法因为会访问磁盘,故受I/O影响性能不是很好,而且不能很好的进行文件备份;第二种方法虽然解决了文件备份(数据库的备份)问题,但是由于字段的字节数太大,对数据库本身也会造成影响,性能也很低下.
微软在SQL Server 2008推出了一种新的方式 - FileStream,它不是一种新的数据类型,而是一种技术,它使SQL Server数据库引擎和NTFS文件系统成为了一个整体,它结合了上面两种方式的优点:FileStream使用NT系统来缓存文件数据,而对文件数据的操作可使用Transact-SQL语句对其进行插入、更新、查询、搜索和备份.
1、FileStream配置 。
1.配置SQL Server安装实例:Start -> All Programs -> Microsoft SQL Server 2008 R2 -> Configuration Tools -> SQL Server Configuration Manager 。
右击属性,切换到FILESTREAM标签,勾选如下配置 。
2. 打开SQL Server,并配置如下 。
以上也可以通过如下脚本执行:
1
2
|
Exec
sp_configure filesteam_access_level, 2
RECONFIGURE
|
最后重启SQL Server Service 。
2、实例展示 。
创建FileStream类型文件/组 。
1
2
3
4
5
6
7
8
|
--Create filestreamgroup
ALTER
DATABASE
[Archive]
ADD
FILEGROUP [FileStreamGroup]
CONTAINS
FILESTREAM
GO
--Create filestream and association with filestreamgroup above
ALTER
DATABASE
[Archive]
ADD
FILE (
NAME
= N
'FileStream'
, FILENAME = N
'D:\Company\Data\SQL Server\FileStream'
)
TO
FILEGROUP [FileStreamGroup]
GO
|
创建测试表(注意:如果表包含FILESTREAM列,则每一行都必须具有唯一的行ID) 。
1
2
3
4
5
6
7
8
9
|
--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]
|
插入一些测试数据 。
1
2
3
4
5
|
--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
)))
|
从前台插入一些数据 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
();
}
|
检索数据 。
1
|
SELECT
DATALENGTH(CONTENT)/(1024.0 * 1024.0)
AS
MB,*
FROM
ATTACHMENT
|
结果 。
文件系统 。
上面的文件都是上传的真实文件,只不过没有后缀,如果重命名加上后缀,即可读取,如最后一个是excel文件,加上.xls,即可用Excel软件打开此文件 。
3、注意事项 。
请注意以下事项:
•并不是所有的文件存储都适合使用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 。
最后此篇关于SQL Server FileStream详解的文章就讲到这里了,如果你想了解更多关于SQL Server FileStream详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要对同一文件进行一批写入,但在文件内的不同位置。我想以尽可能最好的性能实现这一目标,因此查看了同步 FileStream.Write 和异步 FileStream.BeginWrite 方法。 同
MSDN说FileStream.Flush(True) “还清除所有中间文件缓冲区。”。 “所有中间文件缓冲区”到底是什么意思? 最佳答案 它会将缓冲在文件系统缓存中的文件数据写入磁盘。该数据通常是根
考虑以下摘自 Microsoft docs 的代码: using FileStream createStream = File.Create(fileName); // ...write to str
我对Spark的理解fileStream()方法是将三种类型作为参数:Key , Value , 和 Format .对于文本文件,适当的类型是:LongWritable , Text , 和 Tex
为什么 FileStream.Length 是 long 类型,但 FileStream.Read 参数 - offset 有更短的长度 int 呢? 布莱恩 最佳答案 offset 参数告诉从哪里开
我编写了以下程序,其目的是创建一个给定大小的文件,其中包含一些随机数据。该程序运行良好,并完成了它应该做的事情。但是,我不明白为什么它会消耗 5GB 的 RAM(请参阅我的任务管理器的屏幕截图)。当我
我在一次采访中被问到这个问题,我说答案是 Managed。面试官似乎很惊讶。我的问题是即使它访问一个文件( native /非托管资源),但这个类不是托管的吗?或者你认为我应该有一些后续问题以获得更多
我正在编写一些代码作为打开文件框架的一部分。该文件属于自定义类型,不应由我的应用程序的多个实例打开。为了停止打开多个文件,我使用文件流创建一个锁定文件,然后保持所述文件流打开。 这似乎可以防止我的应用
我正在使用 Apache Commons Net 的 FTPClient 从位于服务器上的文件中读取内容。仅读取一次时效果很好。但是当我尝试读取第二个文件时,FTPClient 的 InputStre
问题 有没有办法在 C# 中创建带偏移量的 FileStream?例如,如果我在偏移量 100 处打开 SomeFile.bin,Stream.Position 将等于 0,但读取和写入将偏移 100
我正在阅读一个简单的文本文件,其中包含使用文件流类的单行。但似乎 filestream.read 在开头添加了一些垃圾字符。 代码下方。 using (var _fs = File.Open(_idF
我正在使用 FileStream 将 FTP 服务器的信息下载到我的 C:\驱动器上的目录中。出于某种原因,即使我什至尝试将目录权限设置为“所有人”访问权限,它也给了我这个异常(exception):
我正在尝试通过将文件作为参数的 API 上传 .srt 文件。 文件存储在服务器上,我正在使用 FileStream 和 StreamWriter 写入: string path = Server.M
我四处搜索了一下,但找不到能完美解决我的问题的东西。我有一些代码,即来 self 的数据库的 FileStream varbinary,并将其制作成客户端计算机上的文件,双击时可以在文件类型的默认应用
我最近在做一个涉及很多FileStreaming 的项目,这是我以前没有真正接触过的。 为了尝试更好地熟悉这些方法的原理,我编写了一些代码(理论上)将文件从一个 dir 下载到另一个,并逐步完成,在我
我通过例如下载文件5 个线程。当其中一个线程完成下载文件部分时 - 它被中止,但所有其余线程都有 ThreadState = WaitSleepJoin 并且显然停止下载。如何解决? while ((
我试图将 5 GB 的 ISO 文件复制到具有 29 GB 可用空间的 32 GB 闪存驱动器上。 Windows 7 拒绝让我拖放文件到闪存驱动器,报告文件对于目标文件系统来说太大了。 我最终了解到
我发现将 BufferedStream 与 FileStream 结合使用没有意义,因为它有自己的缓冲策略。然而,我想知道一件事: FileStream fsWithBuffer = new File
我有一个只读的 FileStream,它是一个方法局部变量: public void SomeMethod() { var fileStream = File.Open(fileName, Fi
我有两个文件流,它们从不同的文件中收集不同的信息: FileStream dataStruc = new FileStream("c:\\temp\\dataStruc.txt", FileMode.
我是一名优秀的程序员,十分优秀!