SQL Server 2008 FileStream支持“真功夫版”
文章主要描述的是SQL Server 2008 FileStream支持,你如果對(duì)SQL Server 2008 FileStream支持有興趣的話你就可以點(diǎn)擊以下的文章進(jìn)行觀看了,你如果對(duì)其有興趣的話你就可以點(diǎn)擊以下的文章進(jìn)行觀看了。
服務(wù)器有一個(gè)屬性,即指定該服務(wù)器是怎么支持文件流的
實(shí)際上文件流的出現(xiàn)就是為了解決對(duì)大對(duì)象的存儲(chǔ)中一個(gè)矛盾。
對(duì)于大對(duì)象,第一種方式是存儲(chǔ)在數(shù)據(jù)庫(kù)里面,這種方式一般使用image字段,或者varbinary(max)來(lái)做。好處是可以統(tǒng)一備份,但實(shí)際上讀取效率比較低。大于1MB的文件就會(huì)有問題
第二種方式是文件存儲(chǔ)在文件系統(tǒng),而數(shù)據(jù)庫(kù)中存儲(chǔ)了一個(gè)路徑。這種方式數(shù)據(jù)庫(kù)壓力減輕了,卻很不方便統(tǒng)一備份和管理。
SQL SERVER 2008的文件流其實(shí)就是二者的統(tǒng)一。文件還是放在文件系統(tǒng)的,但由數(shù)據(jù)庫(kù)進(jìn)行管理??梢越y(tǒng)一備份和還原。
FILESTREAM不是一個(gè)字段類型,它定義在字段后面,聲明該列用于文件流即可。該列依然是用二進(jìn)制保存的
一般都是在數(shù)據(jù)庫(kù)中要特別添加一個(gè)文件組和一個(gè)或多個(gè)文件用來(lái)存儲(chǔ)FileStream的數(shù)據(jù)的。
然后,在磁盤上面有一個(gè)目錄(Test),里面會(huì)有一個(gè)filestream.hdr文件
客戶端是透明的。無(wú)需要什么修改。
*/
這段代碼的作用是啟用服務(wù)器支持文件流
- EXEC sp_filestream_configure
- @enable_level = 3;
- CREATE DATABASE Archive
- ON
- PRIMARY ( NAME = Arch1,
- FILENAME = 'c:labarchdat1.mdf'),
- FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3,
- FILENAME = 'c:labfilestream1')
- LOG ON ( NAME = Archlog1,
- FILENAME = 'c:labarchlog1.ldf')
- GO
- CREATE TABLE Archive.dbo.Records
- (
- [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
- [SerialNumber] INTEGER UNIQUE,
- [Chart] VARBINARY(MAX) FILESTREAM NULL
這一句指示該列要用文件流存儲(chǔ)
這里還可以做一些改進(jìn),就是加入文件類型的一個(gè)字段(FileName)
- )
- FILESTREAM_ON FileStreamGroup1
該行指示存儲(chǔ)到哪一個(gè)文件流文件組
GO
下面代碼無(wú)法運(yùn)行,如果一個(gè)表要使用文件流,則必須有一個(gè)GUID列,而且作為唯一鍵列
- CREATE TABLE Archive.dbo.Records2
- (
- --[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
- [SerialNumber] INTEGER UNIQUE,
- [Chart] VARBINARY(MAX) FILESTREAM NULL
--這一句指示該列要用文件流存儲(chǔ)
)
FILESTREAM_ON FileStreamGroup1 --該行指示存儲(chǔ)到哪一個(gè)文件流
- GO
- INSERT INTO Archive.dbo.Records
- VALUES (newid (), 1, NULL);
- GO
- INSERT INTO Archive.dbo.Records
- VALUES (newid (), 2,
- CAST ('' as varbinary(max)));
- GO
- INSERT INTO Archive.dbo.Records
- VALUES (newid (), 3,
- CAST ('Seismic Data' as varbinary(max)));
- GO
- UPDATE Archive.dbo.Records
- SET [Chart] = CAST('Xray 1' as varbinary(max))
- WHERE [SerialNumber] = 2;
- DELETE Archive.dbo.Records
- WHERE SerialNumber = 1;
- GO
- SELECT * FROM Archive.dbo.Records
- GO
對(duì)于客戶端編程來(lái)說,是沒有區(qū)別的,這只是服務(wù)器的一個(gè)存儲(chǔ)改變
保存
保存音樂文件
- try
- {
- OpenFileDialog dialog = new OpenFileDialog();
- dialog.Filter = "音樂文件(*.mp3)|*.mp3";
- if (dialog.ShowDialog() == DialogResult.OK)
- {
- using (SqlConnection conn = new SqlConnection(CONNECTIONSTRING)) {
- conn.Open();
- using (SqlCommand cmd = conn.CreateCommand()) {
- cmd.CommandText = "INSERT INTO BINARYTABLE(BINARYCONTENTS) VALUES(@file)";
- FileStream fs = new FileStream(dialog.FileName, FileMode.Open);
- byte[] bytes = new byte[fs.Length];
- fs.Read(bytes, 0, bytes.Length);
- SqlParameter param = new SqlParameter("@file", SqlDbType.VarBinary,1000000);
- param.Value = bytes;
- cmd.Parameters.Add(param);
- MessageBox.Show(cmd.ExecuteNonQuery() == 1 ? "成功保存文件" : "保存文件失敗");
- fs.Close();
- }
- conn.Close();
- }
- }
- else
- MessageBox.Show("用戶取消了操作");
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
讀取
讀取音樂文件
- try
- {
- using (SqlConnection conn = new SqlConnection(CONNECTIONSTRING)) {
- conn.Open();
- using (SqlCommand cmd = conn.CreateCommand()) {
- cmd.CommandText = "select top 1 BinaryContents from BinaryTable order by ID desc";
- SqlDataReader reader = cmd.ExecuteReader();
- SaveFileDialog dialog = new SaveFileDialog();
- dialog.Filter = "音樂文件(*.mp3)|*.mp3";
- if (dialog.ShowDialog() == DialogResult.OK)
- {
- reader.Read();
- System.Data.SqlTypes.SqlBinary result = reader.GetSqlBinary(0);//值得注意的是這里并沒有什么GetSqlImage的方法
- FileStream fs = new FileStream(dialog.FileName, FileMode.Create);
- fs.Write(result.Value, 0, result.Length);
- fs.Close();
- reader.Close();
- }
- else
- MessageBox.Show("用戶取消操作");
- }
- conn.Close();
- }
- }
- catch (Exception ex) { MessageBox.Show(ex.Message); }
以上的相關(guān)內(nèi)容就是對(duì)SQL Server 2008 FileStream支持的介紹,望你能有所收獲。
【編輯推薦】
- SQL Server2000連接錯(cuò)誤的緣由有哪些?
- SQL Server實(shí)例中對(duì)另個(gè)實(shí)例的調(diào)用
- SQL Server identity列,美中不足之處
- SQL Server DateTime數(shù)據(jù)類型的另類解讀
- SQL Server 2000的安全策略的正確打造