使用 WCF 服務模型在 SQL 中具有大型資料類型的資料表和檢視上執行作業
SQL 配接器可讓配接器用戶端讀取和更新大型資料類型資料行中的資料,也就是 Varchar (max) 、Nvarchar (max) 或 Varbinary (max) 。 若要從這類資料行讀取資料,配接器用戶端可以使用選取作業。 若要將資料插入或更新至這類資料行,配接器會公開 Set <column_name> 作業,其中 <column_name> 是 Varchar 類型資料行的名稱 (max) 、Nvarchar (max) 或 Varbinary (max) 。
此外,在SQL Server中,您可以讓 varbinay (max) 資料行儲存非結構化資料,例如文字檔和影像。 這類非結構化資料稱為 FILESTREAM 資料。 FILESTREAM 資料可以儲存為檔案系統上的檔案。 SQL 配接器可讓用戶端將 FILESTREAM 資料輸入 Varbinary 類型的資料行, (max) 。 FILESTREAM 儲存體 有詳細資訊。
本主題提供您必須在執行SQL Server電腦上執行之特定工作的相關資訊,以及執行配接器用戶端的電腦,才能插入或更新 FILESTREAM 資料。 本主題也提供執行 Set <column_name> 作業以插入 FILESTREAM 資料的指示。
注意
如果您要對具有使用者定義型別資料行的資料表執行作業,請務必使用 SQL 配接器來參考 具有 User-Defined 型別之資料表和檢視的作業。
必要條件
您必須在執行 SQL Server 的電腦上執行下列工作,以及執行配接器用戶端的電腦。
在執行 SQL Server 的電腦上
您必須在 SQL Server 實例上啟用 FILESTREAM。 請參閱 啟用和設定 FILESTREAM。
您必須建立已啟用 FILESTREAM 的資料庫。 請參閱 建立 FILESTREAM-Enabled 資料庫。
您必須有資料表來儲存 FILESTREAM 資料。 請參閱 建立用於儲存 FILESTREAM 資料的資料表。
在執行配接器用戶端的電腦上
- 您必須安裝 SQL 用戶端連線 SDK。 您可以執行SQL Server安裝程式,並在精靈的 [功能選取] 頁面中選取 [SQL 用戶端連線 SDK],以安裝 SQL 用戶端連線 SDK。 配接器會使用隨 SQL 用戶端連線 SDK 一起安裝的 sqlncli10.dll 來執行 FILESTREAM 作業。
完成這些工作之後,您全都會設定為在SQL Server資料庫資料表中插入或更新 FILESTREAM 資料。
本主題如何示範大型資料類型的作業
若要示範如何在具有大型資料類型的> 資料表上執行設定 < column_name作業,請取得具有資料行識別碼和Document的資料表、記錄:
使用所有資料的 Records 資料表是藉由執行範例所提供的 SQL 腳本來建立。 如需詳細資訊,請參閱 配接器範例。
Id資料行的類型為 uniqueidentifier,並採用 GUID。 假設 識別碼 資料行已經有 GUID '
438B7B4C-5491-409F-BCC1-78817C399EC3
'。Document資料行的類型為 VARBINARY (MAX) 。 若要更新 Document 資料行,配接器會公開 SetDocument 作業。
注意
針對SQL Server,若要示範 FILESTREAM 作業,請假設Document資料行可以儲存 FILESTREAM 資料。
關於本主題中使用的範例
本主題中的範例會在 Records 資料表上執行作業。 記錄資料表是藉由執行範例所提供的 SQL 腳本來建立。 如需範例的詳細資訊,請參閱 配接器範例。 SQL 配接器範例也會提供以本主題為基礎的範例 Records_FILESTREAM_Op。
WCF 用戶端類別
針對 SQL 配接器所探索的大型資料類型作業所產生的 WCF 用戶端名稱,是以資料表或檢視表的名稱為基礎,如下表所列。
SQL Server資料庫成品 | WCF 用戶端名稱 |
---|---|
資料表 | TableOp_[Schema]_[TABLE_NAME]Client |
檢視 | ViewOp_[Schema]_[VIEW_NAME]Client |
[SCHEMA] = SQL Server成品的集合;例如 dbo。
叫用大型資料類型資料行之作業的方法簽章
下表顯示資料表上基本作業的方法簽章。 檢視的簽章相同,不同之處在于檢視命名空間和名稱會取代資料表的簽章。
作業 | 方法簽章 |
---|---|
設定 <column_name> | public void Set <column_name> (string Filter, byte[] Data) ; |
<column_name>= 大型資料類型的資料行名稱。
例如,下列程式碼會顯示在預設 「dbo」 架構下,Record資料表上針對 SetDocument作業產生的 WCF 用戶端類別方法簽章。
public partial class TableOp_dbo_RecordsClient : System.ServiceModel.ClientBase<TableOp_dbo_Records>, TableOp_dbo_Records {
public void SetDocument (string Filter, byte[] Data);
}
在此程式碼片段中, TableOp_dbo_RecordsClient 是新增配接器服務參考外掛程式所產生的 SqlAdapterBindingClient.cs 中 WCF 類別的名稱。
大型資料類型資料行作業的參數
本節提供 Set <column_name> 作業所需的參數。
參數名稱 | 描述 |
---|---|
字串篩選 | 根據配接器更新大型資料類型之資料行的記錄,指定 WHERE 子句。 |
byte[] 資料 | 指定必須針對大型資料類型之資料行更新的值。 |
Set <column_name> 作業不會傳回任何值。
建立 WCF 用戶端以叫用大型資料類型資料行上的作業
使用 WCF 用戶端在 SQL Server 上執行作業所需的一般動作集,牽涉到使用SQL 配接器之 WCF 服務模型概觀中所述的一組工作。 本節說明如何建立 WCF 用戶端,以在Records資料表上叫用SetDocument作業。 配接器會公開 SetDocument 作業,以更新大型資料類型資料行中的資料。
建立 WCF 用戶端
在 Visual Studio 中建立 Visual C# 專案。 針對本主題,建立主控台應用程式。
在Records資料表上產生SetDocument作業的 WCF 用戶端類別。 如需產生 WCF 用戶端類別的詳細資訊,請參閱產生 WCF 用戶端或 wcf 服務合約以SQL Server成品。
在 方案總管中,新增 、
Microsoft.ServiceModel.Channels
和System.Transactions
的Microsoft.Adapters.Sql
參考。開啟 Program.cs 檔案並新增
System.Transactions
命名空間。在 Program.cs 中,建立用戶端,如下列程式碼片段所述。
TableOp_dbo_RecordsClient client = new TableOp_dbo_RecordsClient("SqlAdapterBinding_TableOp_dbo_Records"); client.ClientCredentials.UserName.UserName = ""; client.ClientCredentials.UserName.Password = "";
在此程式碼片段中,
TableOp_dbo_RecordsClient
是 SqlAdapterBindingClient.cs 中定義的 WCF 用戶端。 此檔案是由新增配接器服務參考外掛程式所產生。SqlAdapterBinding_TableOp_dbo_Records
是用戶端端點組態的名稱,且定義于 app.config 中。此檔案也會由 [新增配接器服務參考外掛程式] 產生,並包含系結屬性和其他組態設定。警告
若要對 FILESTREAM 資料執行作業,您必須一律使用 Windows 驗證 連接到 SQL Server。 若要使用 Windows 驗證 進行連線,您必須提供空的使用者名稱和密碼,如上述程式碼片段所示。 此外,在使用 Windows 驗證 連線到 SQL Server 之前,您必須先執行使用Windows 驗證搭配 SQL 配接器連線到 SQL Server中所述的步驟。
注意
在此程式碼片段中,您會使用組態檔中的系結和端點位址。 您也可以在程式碼中明確指定這些值。 如需指定用戶端系結之不同方式的詳細資訊,請參閱 設定 SQL 配接器的用戶端系結。
開啟用戶端,如下列程式碼片段所述:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
在Records資料表上叫用SetDocument作業。
警告
設定< column_name >作業一律必須在交易中執行。 若要確保這一點,必須在交易範圍內叫用 Set< column_name >作業,而且 UseAmbientTransaction系結屬性必須在 app.config 中設定為true。
using (TransactionScope tx = new TransactionScope()) { string filter = "WHERE Id='438B7B4C-5491-409F-BCC1-78817C399EC3'"; byte[] data = ASCIIEncoding.ASCII.GetBytes("Sample data"); client.SetDocument(filter, data); tx.Complete(); }
在這裡,應用程式會將字串「範例資料」轉換成 base64 編碼字串,並在符合篩選準則的記錄中更新它。
如下列程式碼片段所述關閉用戶端:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
建置專案,然後加以執行。 應用程式會更新[記錄] 資料表中的[檔]資料行。