文章主要描述的是SQL Server 2008 FileStream支持,你如果对SQL Server 2008 FileStream支持有兴趣的话你就可以点击以下的文章进行观看了,你如果对其有兴趣的话你就可以点击以下的文章进行观看了。
服务器有一个属性,即指定该服务器是怎么支持文件流的
实际上文件流的出现就是为了解决对大对象的存储中一个矛盾。
对于大对象,第一种方式是存储在数据库里面,这种方式一般使用image字段,或者varbinary(max)来做。好处是可以统一备份,但实际上读取效率比较低。大于1MB的文件就会有问题
第二种方式是文件存储在文件系统,而数据库中存储了一个路径。这种方式数据库压力减轻了,却很不方便统一备份和管理。
SQL SERVER 2008的文件流其实就是二者的统一。文件还是放在文件系统的,但由数据库进行管理。可以统一备份和还原。
FILESTREAM不是一个字段类型,它定义在字段后面,声明该列用于文件流即可。该列依然是用二进制保存的
一般都是在数据库中要特别添加一个文件组和一个或多个文件用来存储FileStream的数据的。
然后,在磁盘上面有一个目录(Test),里面会有一个filestream.hdr文件
客户端是透明的。无需要什么修改。
*/
这段代码的作用是启用服务器支持文件流
EXECsp_filestream_configure @enable_level=3; CREATEDATABASEArchive ON PRIMARY(NAME=Arch1, FILENAME='c:labarchdat1.mdf'), FILEGROUPFileStreamGroup1CONTAINSFILESTREAM(NAME=Arch3, FILENAME='c:labfilestream1') LOGON(NAME=Archlog1, FILENAME='c:labarchlog1.ldf') GO CREATETABLEArchive.dbo.Records ( [Id][uniqueidentifier]ROWGUIDCOLNOTNULLUNIQUE, [SerialNumber]INTEGERUNIQUE, [Chart]VARBINARY(MAX)FILESTREAMNULL
这一句指示该列要用文件流存储
这里还可以做一些改进,就是加入文件类型的一个字段(FileName)
) FILESTREAM_ONFileStreamGroup1
该行指示存储到哪一个文件流文件组
GO
下面代码无法运行,如果一个表要使用文件流,则必须有一个GUID列,而且作为唯一键列
CREATETABLEArchive.dbo.Records2 ( --[Id][uniqueidentifier]ROWGUIDCOLNOTNULLUNIQUE, [SerialNumber]INTEGERUNIQUE, [Chart]VARBINARY(MAX)FILESTREAMNULL
–这一句指示该列要用文件流存储
)
FILESTREAM_ON FileStreamGroup1 –该行指示存储到哪一个文件流
GO INSERTINTOArchive.dbo.Records VALUES(newid(),1,NULL); GO INSERTINTOArchive.dbo.Records VALUES(newid(),2, CAST(''asvarbinary(max))); GO INSERTINTOArchive.dbo.Records VALUES(newid(),3, CAST('SeismicData'asvarbinary(max))); GO UPDATEArchive.dbo.Records SET[Chart]=CAST('Xray1'asvarbinary(max)) WHERE[SerialNumber]=2; DELETEArchive.dbo.Records WHERESerialNumber=1; GO SELECT*FROMArchive.dbo.Records GO
对于客户端编程来说,是没有区别的,这只是服务器的一个存储改变
保存
保存音乐文件
try { OpenFileDialogdialog=newOpenFileDialog(); dialog.Filter="音乐文件(*.mp3)|*.mp3"; if(dialog.ShowDialog()==DialogResult.OK) { using(SqlConnectionconn=newSqlConnection(CONNECTIONSTRING)){ conn.Open(); using(SqlCommandcmd=conn.CreateCommand()){ cmd.CommandText="INSERTINTOBINARYTABLE(BINARYCONTENTS)VALUES(@file)"; FileStreamfs=newFileStream(dialog.FileName,FileMode.Open); byte[]bytes=newbyte[fs.Length]; fs.Read(bytes,0,bytes.Length); SqlParameterparam=newSqlParameter("@file",SqlDbType.VarBinary,1000000); param.Value=bytes; cmd.Parameters.Add(param); MessageBox.Show(cmd.ExecuteNonQuery()==1?"成功保存文件":"保存文件失败"); fs.Close(); } conn.Close(); } } else MessageBox.Show("用户取消了操作"); } catch(Exceptionex) { MessageBox.Show(ex.Message); }
读取
读取音乐文件
try { using(SqlConnectionconn=newSqlConnection(CONNECTIONSTRING)){ conn.Open(); using(SqlCommandcmd=conn.CreateCommand()){ cmd.CommandText="selecttop1BinaryContentsfromBinaryTableorderbyIDdesc"; SqlDataReaderreader=cmd.ExecuteReader(); SaveFileDialogdialog=newSaveFileDialog(); dialog.Filter="音乐文件(*.mp3)|*.mp3"; if(dialog.ShowDialog()==DialogResult.OK) { reader.Read(); System.Data.SqlTypes.SqlBinaryresult=reader.GetSqlBinary(0);//值得注意的是这里并没有什么GetSqlImage的方法 FileStreamfs=newFileStream(dialog.FileName,FileMode.Create); fs.Write(result.Value,0,result.Length); fs.Close(); reader.Close(); } else MessageBox.Show("用户取消操作"); } conn.Close(); } } catch(Exceptionex){MessageBox.Show(ex.Message);}
以上的相关内容就是对SQL Server 2008 FileStream支持的介绍,望你能有所收获。
【编辑推荐】
- SQL Server2000连接错误的缘由有哪些?SQL Server实例中对另个实例的调用SQL Server identity列,美中不足之处SQL Server DateTime数据类型的另类解读SQL Server 2000的安全策略的正确打造