WCF サービス モデルを使用して SQL で大きなデータ型を持つテーブルとビューに対する操作を実行する
SQL アダプターを使用すると、アダプター クライアントは、大きなデータ型 (varchar(max)、nvarchar(max)、または varbinary(max) の列のデータを読み取って更新できます。 このような列からデータを読み取るために、アダプター クライアントは Select 操作を使用できます。 このような列にデータを挿入または更新するために、アダプターは Set<column_name> 操作を公開します。ここで、 <column_name> は varchar(max)、nvarchar(max)、または varbinary(max) 型の列の名前です。
また、SQL Serverでは、varbinay(max) 列にテキスト ドキュメントや画像などの非構造化データを格納させることができます。 このような非構造化データは FILESTREAM データと呼ばれます。 FILESTREAM データは、ファイル システム上のファイルとして格納できます。 SQL アダプターを使用すると、クライアントは varbinary(max) 型の列に FILESTREAM データを入力できます。 FILESTREAM ストレージ には、詳細情報があります。
このトピックでは、FILESTREAM データを挿入または更新するために、SQL Serverを実行しているコンピューターとアダプター クライアントを実行しているコンピューターで実行する必要がある特定のタスクについて説明します。 このトピックでは、FILESTREAM データを挿入するための set<column_name> 操作の実行手順についても説明します。
Note
ユーザー定義型の列を持つテーブルに対して操作を実行する場合は、「 SQL アダプターを使用した User-Defined 型を使用したテーブルとビューに対する操作」を参照してください。
前提条件
SQL Serverを実行しているコンピューターとアダプター クライアントを実行しているコンピューターで、次のタスクを実行する必要があります。
SQL Serverを実行しているコンピューターで
SQL Server インスタンスで FILESTREAM を有効にする必要があります。 「 FILESTREAM を有効にして構成する」を参照してください。
FILESTREAM 対応データベースを作成する必要があります。 「 FILESTREAM-Enabled データベースを作成する」を参照してください。
FILESTREAM データを格納するためのテーブルが必要です。 FILESTREAM データを格納するためのテーブルの作成に関するページを参照してください。
アダプター クライアントを実行しているコンピューターで
- SQL Client Connectivity SDK がインストールされている必要があります。 SQL Client Connectivity SDK をインストールするには、SQL Serverセットアップを実行し、ウィザードの [機能の選択] ページで [SQL Client Connectivity SDK] を選択します。 アダプターは、SQL Client Connectivity SDK と共にインストールされた sqlncli10.dll を使用して FILESTREAM 操作を実行します。
これらのタスクを完了すると、データベース テーブルに FILESTREAM データを挿入または更新SQL Server設定されます。
このトピックでは、大規模なデータ型に対する操作について説明します
大きなデータ型を持つテーブルに対して set<column_name> 操作を実行する方法を示すには、列 ID と Document を含むテーブル Records を取得します。
すべてのデータを含む Records テーブルは、サンプルに付属の SQL スクリプトを実行して作成されます。 詳細については、「 アダプターのサンプル」を参照してください。
Id 列は uniqueidentifier 型で、GUID を受け取ります。 ID 列に既に GUID '' があると
438B7B4C-5491-409F-BCC1-78817C399EC3
します。Document 列の型は VARBINARY(MAX) です。 Document 列を更新するために、アダプターは SetDocument 操作を公開します。
Note
SQL Server、FILESTREAM 操作を示すために、Document 列に FILESTREAM データを格納できると仮定します。
このトピックで使用する例について
このトピックの例では、 Records テーブルに対して操作を実行します。 Records テーブルは、サンプルに付属の SQL スクリプトを実行して作成されます。 サンプルの詳細については、「アダプターの サンプル」を参照してください。 このトピックに基づく サンプル Records_FILESTREAM_Opは、SQL アダプターのサンプルでも提供されています。
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" スキーマの下にある Records テーブルの 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> 操作に必要なパラメーターを提供します。
パラメーター名 | 説明 |
---|---|
string Filter | アダプターが大きなデータ型の列のレコードを更新する WHERE 句を指定します。 |
byte[] Data | 大きなデータ型の列に対して更新する必要がある値を指定します。 |
Set<column_name> 操作は値を返しません。
大きなデータ型の列に対する操作を呼び出す WCF クライアントの作成
WCF クライアントを使用してSQL Serverに対して操作を実行するために必要な一連の一般的なアクションには、「SQL アダプターを使用した WCF サービス モデルの概要」で説明されている一連のタスクが含まれます。 このセクションでは、レコード テーブルに対して SetDocument 操作を呼び出す WCF クライアントを作成する方法について説明します。 アダプターは SetDocument 操作を公開して、大きなデータ型の列のデータを更新します。
WCF クライアントを作成するには
Visual Studio で Visual C# プロジェクトを作成します。 このトピックでは、コンソール アプリケーションを作成します。
レコード テーブルに対する SetDocument 操作の WCF クライアント クラスを生成します。 WCF クライアント クラスの生成の詳細については、「 Generate a WCF Client or WCF Service Contract for SQL Server Artifacts」を参照してください。
ソリューション エクスプローラーで、、、 への参照を
Microsoft.Adapters.Sql
Microsoft.ServiceModel.Channels
追加しますSystem.Transactions
。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に接続する前に、「SQL アダプターで Windows 認証を使用するSQL Serverに接続する」に記載されている手順を実行しておく必要があります。
Note
このスニペットでは、構成ファイルのバインドとエンドポイント アドレスを使用します。 これらの値をコードで明示的に指定することもできます。 クライアント バインドを指定するさまざまな方法の詳細については、「 SQL アダプターのクライアント バインドを構成する」を参照してください。
次のスニペットで説明されているように、クライアントを開きます。
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
レコード テーブルに対して SetDocument 操作を呼び出します。
注意事項
Set<column_name> 操作は常にトランザクションで実行する必要があります。 これを確実に行うには、トランザクション スコープ内で set<column_name>操作を呼び出す必要があり、app.config で UseAmbientTransaction バインド プロパティを 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(); }
ここで、アプリケーションは文字列 "Sample data" を base64 でエンコードされた文字列に変換し、フィルター条件を満たすレコード内で更新します。
次のスニペットで説明されているように、クライアントを閉じます。
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
プロジェクトをビルドし、実行します。 アプリケーションは、Records テーブルの Document 列を更新します。