[SQL Server][.NET]上傳檔案到SQL Server資料庫(FileStream)

上一篇筆記varbinary儲存小型文件檔案,當使用者上傳檔案平均超過1MB,我們就可以考慮SQL Server 2008 推出的Filestream。

如果想透過網芳上傳檔案到sql server機器再從sql table取得目錄資訊,則可以考慮SQL Server 2012推出的File table。

這篇先筆記FileStream要設定的步驟:

FileTable連結

 

1.開啟SQL Server 組態管理員,點選對應的Database Engine,按下右鍵內容並勾選以下選項後,按下確認。

  • 啟用FileStream的transact-sql 存取
  • 啟用FileStream的檔案I/O存取
  • 啟用遠端用戶的FileStream資料夾存取。

 

2.設定SQL INSTANCE Filestream存取層級

--設定FILESTREAM存取層級
EXEC sp_configure FILESTREAM_ACCESS_LEVEL, 2 
GO

RECONFIGURE
GO

--0	針對這個執行個體停用 FILESTREAM 支援。
--1	針對 Transact-SQL 存取啟用 FILESTREAM。
--2	針對 Transact-SQL 和 Win32 資料流存取啟用 FILESTREAM。

檔案資料流存取層級伺服器組態選項

 

3.對現有資料表增加檔案群組及檔案

ALTER DATABASE [DEMO]
ADD FILEGROUP [FGStream] CONTAINS FILESTREAM
GO

ALTER DATABASE [DEMO]
ADD FILE (NAME = N'FileStreamDoc', FILENAME = N'T:\SQL\FileStream')
TO FILEGROUP [FGStream]
GO

 

4.建立具有File Stream欄位的資料表。

 建立資料表時需要注意兩個地方:

A.這個資料表必須有一個NULL唯一ROWGUIDCOL欄位。

B.放置大型二進位物件的欄位必須加上FILESTREAM。

IF EXISTS (SELECT name FROM sys.tables WHERE name = N'Document')
         DROP table  Document;

CREATE TABLE [dbo].[Document](
	[GUID]  [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
	[CONTENT_TYPE] [nvarchar](100) NULL,
	[FILE_NAME] [nvarchar](50) NULL,
	[DATA] [varbinary](max) FILESTREAM  NULL,
	[SIZE] [numeric](13, 2) NULL,
	[MNT_USER] [varchar](20) NULL,
	[MNT_DT] [datetime] NULL
) ON [PRIMARY] 
GO

未符合條件1會出現以下訊息:

--訊息 5505,層級 16,狀態 1,行 50

--具有 FILESTREAM 資料行的資料表必須有非 NULL 的唯一 ROWGUIDCOL 資料行。

 

5.程式碼調整

  可參考上一篇筆記varbinary上傳檔案的步驟2.3.4

  因為檔案鍵值GUID由Identity int改為[uniqueidentifier],這邊寫入時需要調整使用new_id()方法取得uniqueidentifier序號。

  string query = "insert into Document1 values (newid(),@CONTENT_TYPE,@FILE_NAME,@DATA,@SIZE,@MNT_USER,@MNT_DT)";

  其他地方皆相同!

 

6.測試兩個檔案上傳

  上傳ok

進入資料庫本機目錄觀察:

高可用性上的適用性:

  • Failover clustering: When you are using failover clustering, the FILESTREAM filegroups must be on shared disk resources.
  • AlwaysOn: All FILESTREAM functionality is supported. After a failover, FILESTREAM data is accessible on both readable secondary replicas and on the new primary.(注意kb3089527)

 

參考:

FILESTREAM (SQL Server)

FILESTREAM and FileTable with AlwaysOn Availability Groups (SQL Server)

FIX: FileStream Share Access fails when you use AlwaysOn Availability Groups feature in SQL Server 2012