SQL Server 2008 FileStream支持“真功夫版”
文章主要描述的是SQL Server 2008 FileStream支持,你如果對SQL Server 2008 FileStream支持有興趣的話你就可以點擊以下的文章進行觀看了,你如果對其有興趣的話你就可以點擊以下的文章進行觀看了。
服務器有一個屬性,即指定該服務器是怎么支持文件流的
實際上文件流的出現就是為了解決對大對象的存儲中一個矛盾。
對于大對象,第一種方式是存儲在數據庫里面,這種方式一般使用image字段,或者varbinary(max)來做。好處是可以統一備份,但實際上讀取效率比較低。大于1MB的文件就會有問題
第二種方式是文件存儲在文件系統,而數據庫中存儲了一個路徑。這種方式數據庫壓力減輕了,卻很不方便統一備份和管理。
SQL SERVER 2008的文件流其實就是二者的統一。文件還是放在文件系統的,但由數據庫進行管理??梢越y一備份和還原。
FILESTREAM不是一個字段類型,它定義在字段后面,聲明該列用于文件流即可。該列依然是用二進制保存的
一般都是在數據庫中要特別添加一個文件組和一個或多個文件用來存儲FileStream的數據的。
然后,在磁盤上面有一個目錄(Test),里面會有一個filestream.hdr文件
客戶端是透明的。無需要什么修改。
*/
這段代碼的作用是啟用服務器支持文件流
- 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
這一句指示該列要用文件流存儲
這里還可以做一些改進,就是加入文件類型的一個字段(FileName)
- )
- FILESTREAM_ON FileStreamGroup1
該行指示存儲到哪一個文件流文件組
GO
下面代碼無法運行,如果一個表要使用文件流,則必須有一個GUID列,而且作為唯一鍵列
- CREATE TABLE Archive.dbo.Records2
- (
- --[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
- [SerialNumber] INTEGER UNIQUE,
- [Chart] VARBINARY(MAX) FILESTREAM NULL
--這一句指示該列要用文件流存儲
)
FILESTREAM_ON FileStreamGroup1 --該行指示存儲到哪一個文件流
- 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
對于客戶端編程來說,是沒有區別的,這只是服務器的一個存儲改變
保存
保存音樂文件
- 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); }
以上的相關內容就是對SQL Server 2008 FileStream支持的介紹,望你能有所收獲。
【編輯推薦】
- SQL Server2000連接錯誤的緣由有哪些?
- SQL Server實例中對另個實例的調用
- SQL Server identity列,美中不足之處
- SQL Server DateTime數據類型的另類解讀
- SQL Server 2000的安全策略的正確打造