WCF サービス モデルを使用して SQL の操作を挿入、更新、削除、または選択する
Microsoft BizTalk Adapter for SQL Serverは、データベース テーブルとビューに対する基本的な挿入、選択、更新、および削除操作SQL Server検出します。 これらの操作を使用すると、ターゲット テーブルまたはビューの Where 句で修飾された単純な SQL Insert、Select、Update、Delete ステートメントを実行できます。 このトピックでは、WCF サービス モデルを使用してこれらの操作を実行する方法について説明します。
アダプターがこれらの操作をサポートする方法の詳細については、「SQL アダプターを使用した テーブルとビューに対する挿入、更新、削除、および選択操作」を参照してください。
Note
ユーザー定義型の列を持つテーブルに対して操作を実行する場合は、アプリケーションの開発を開始する前 に、「SQL アダプターを使用して User-Defined 型を持つテーブルとビュー に対する操作」を参照してください。
このトピックで使用する例について
このトピックの例では、Employee テーブルに対して操作を実行します。 Employee テーブルは、サンプルで提供される SQL スクリプトを実行して作成されます。 サンプルの詳細については、「アダプターの サンプル」を参照してください。 このトピックに基づく EmployeeBasicOps のサンプルも、SQL アダプターのサンプルと共に提供されています。
WCF クライアント クラス
SQL アダプターが検出する基本的な SQL 操作用に生成される WCF クライアントの名前は、次の表に示すように、テーブルまたはビューの名前に基づいています。
SQL Server データベース成果物 | WCF クライアント名 |
---|---|
テーブル | TableOp_[Schema]_[TABLE_NAME]Client |
表示 | ViewOp_[Schema]_[VIEW_NAME]Client |
[SCHEMA] = SQL Server成果物のコレクション (dbo など)。
[TABLE_NAME] = テーブルの名前。たとえば、Employee です。
[VIEW_NAME] = ビューの名前。たとえば、Employee_View。
テーブルに対する操作を呼び出すためのメソッド シグネチャ
次の表は、テーブルに対する基本的な操作のメソッド シグネチャを示しています。 ビューのシグネチャは同じですが、ビューの名前空間と名前がテーブルの名前空間と名前に置き換えられる点が除きます。
操作 | メソッド シグネチャ |
---|---|
挿入 | long[] Insert([TABLE_NS].[TABLE_NAME][] 行); |
Select | [TABLE_NS]。[TABLE_NAME][] Select(string COLUMNS, string QUERY); |
更新 | int Update([TABLE_NS].[TABLE_NAME]。RowPair[] Rows); |
削除 | int Delete([TABLE_NS].[TABLE_NAME][] 行); |
[TABLE_NS] = テーブル名前空間の名前。たとえば、schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee です。
[TABLE_NAME] = テーブルの名前。たとえば、Employee です。
たとえば、次のコードは、既定の "dbo" スキーマの Employee テーブルに対して Delete、Insert、Select、Update の各操作に対して生成された WCF クライアント クラスのメソッド シグネチャを示しています。
public partial class TableOp_dbo_EmployeeClient : System.ServiceModel.ClientBase<TableOp_dbo_Employee>, TableOp_dbo_Employee {
public int Delete(schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Rows);
public long[] Insert(schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Rows);
public schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Select(string Columns, string Query);
public int Update(schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[] Rows);
}
このスニペットでは、TableOp_dbo_EmployeeClientは、アダプター サービス参照の追加プラグインによって生成された SqlAdapterBindingClient.cs の WCF クラスの名前です。
テーブル操作のパラメーター
このセクションでは、各テーブル操作で必要なパラメーターについて説明します
挿入操作
挿入操作の種類 | レコード |
---|---|
複数のレコード | テーブルに挿入する必要がある INSERTRECORDS のコレクション。 |
挿入操作は Long データ型の配列を返し、挿入された行の ID 値 (存在する場合) を格納します。 テーブルに ID 列がない場合、戻り値は NULL です。
操作の選択
COLUMN_NAMES | QUERY |
---|---|
ターゲット内の列名のコンマ区切りのリスト。たとえば、"Employee_ID、指定" などです。 列リストは、結果セットで返されるターゲットの列を指定します。 列リストで指定されていない列は、返されたレコード セットの .NET 既定値に設定されます。 nillable 列の場合、この値は null です。 | クエリのターゲット行を指定する SQL WHERE 句の内容。たとえば、"Designation = 'Manager' などです。 このパラメーターを null に設定すると、ターゲットのすべての行を返すことができます。 |
Select 操作の戻り値は、厳密に型指定された結果セットで、ターゲット テーブルまたはビューから指定された列と行が含まれます。
更新操作
ペアの最初の行 | ペアの 2 行目 |
---|---|
レコード ペアの最初のレコードは、更新する必要がある新しい値に対応します。つまり、UPDATE ステートメントの SET 句に対応します。 これは、 を使用して RowPair.After 設定できます。 |
レコード ペアの 2 番目のレコードは、行の古い値に対応します。つまり、UPDATE ステートメントの WHERE 句に対応します。 これは、 を使用して RowPair.Before 設定できます。 |
Update 操作の戻り値は Int32 データ型で、更新された行数を示します。
重要
更新する必要があるレコードを指定するときは、すべての値が更新されていない場合でも、すべての列の値を指定する必要があります。 たとえば、1 つの行に 5 つの列があり、Update 操作で RowPair.Before の一部として 2 つの列のみが更新される場合は、5 列の値をすべて渡す必要があります。 ただし、RowPair.After では、更新される列のみを指定できます。
削除操作。
Delete 操作は、厳密に型指定されたレコードの配列を入力として受け取ります。 Delete 操作の戻り値は Int32 データ型で、削除された行数を示します。
テーブルとビューに対する操作を呼び出す WCF クライアントの作成
WCF クライアントを使用してSQL Serverに対して操作を実行するために必要な一連の一般的なアクションには、「SQL アダプターを使用した WCF サービス モデルの概要」で説明されている一連のタスクが含まれます。 このセクションでは、テーブルに対する基本的な挿入、選択、更新、削除の各操作を呼び出す WCF クライアントを作成する方法について説明します。
テーブルに対する操作を実行する WCF クライアントを作成するには
Visual Studio で Visual C# プロジェクトを作成します。 このトピックでは、コンソール アプリケーションを作成します。
Employee テーブルの挿入、選択、更新、および削除操作の WCF クライアント クラスを生成します。 WCF クライアント クラスの生成の詳細については、「 Generate a WCF Client or WCF Service Contract for SQL Server Artifacts」を参照してください。
重要
WCF クライアント クラスを生成する前に、 EnableBizTalkCompatibilityMode バインド プロパティを false に設定してください。
ソリューション エクスプローラーで、 と
Microsoft.ServiceModel.Channels
への参照をMicrosoft.Adapters.Sql
追加します。Program.cs ファイルを開き、次のスニペットで説明するようにクライアントを作成します。
TableOp_dbo_EmployeeClient client = new TableOp_dbo_EmployeeClient("SqlAdapterBinding_TableOp_dbo_Employee"); client.ClientCredentials.UserName.UserName = "<Enter user name here>"; client.ClientCredentials.UserName.Password = "<Enter password here>";
このスニペットでは、
TableOp_dbo_EmployeeClient
は SqlAdapterBindingClient.cs で定義されている WCF クライアントです。 このファイルは、アダプター サービス参照の追加プラグインによって生成されます。SqlAdapterBinding_TableOp_dbo_Employee
はクライアント エンドポイント構成の名前であり、app.config で定義されています。このファイルは、アダプター サービス参照の追加プラグインによっても生成され、バインド プロパティとその他の構成設定が含まれています。Note
このスニペットでは、構成ファイルのバインドとエンドポイント アドレスを使用します。 これらの値をコードで明示的に指定することもできます。 クライアント バインドを指定するさまざまな方法の詳細については、「 SQL アダプターのクライアント バインドを構成する」を参照してください。
次のスニペットで説明されているように、クライアントを開きます。
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
Employee テーブルに対して挿入操作を呼び出します。
long[] recordsInserted; schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] insertRecord = new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[1]; insertRecord[0] = new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee(); insertRecord[0].Name = "John Smith"; insertRecord[0].Designation = "Manager"; insertRecord[0].Salary = 500000; try { Console.WriteLine("Inserting new table entry..."); recordsInserted = client.Insert(insertRecord); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; } Console.WriteLine("Record inserted"); Console.WriteLine("Press any key to continue ..."); Console.ReadLine();
前のコード スニペットを置き換えて、Select、Update、または Delete 操作も実行できます。 コード スニペットを追加して、1 つのアプリケーションですべての操作を実行することもできます。 これらの操作の実行方法に関するコード スニペットの場合。
次のスニペットで説明されているように、クライアントを閉じます。
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
プロジェクトをビルドし、実行します。 アプリケーションは、Employee テーブルにレコードを挿入します。
操作の選択
次のコードは、Employee テーブルを対象とする Select 操作を示しています。 Select 操作では、テーブルに挿入された最後のレコードが選択されます。 返されたレコードはコンソールに書き込まれます。
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] selectRecords;
try
{
Console.WriteLine("Selecting Row...");
selectRecords = client.Select("*", "where [Employee_ID] = (select IDENT_CURRENT('Employee'))");
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
throw;
}
Console.WriteLine("The details of the newly added employee are:");
Console.WriteLine("********************************************");
for (int i = 0; i < selectRecords.Length; i++)
{
Console.WriteLine("Employee ID : " + selectRecords[i].Employee_ID);
Console.WriteLine("Employee Name : " + selectRecords[i].Name);
Console.WriteLine("Employee Desigation: " + selectRecords[i].Designation);
Console.WriteLine();
}
Console.WriteLine("********************************************");
Console.WriteLine("Press any key to continue ...");
Console.ReadLine();
更新操作
次のコードは、Employee テーブルを対象とする Update 操作を示しています。
int result;
schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair updateRecordPair =
new schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair();
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee updateRecord =
new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee();
schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[] updateArray =
new schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[1];
updateRecord = insertRecord[0];
updateRecord.Name = "Jeff Smith";
updateRecordPair.After = updateRecord;
updateRecordPair.Before = selectRecords[0];
updateArray[0] = updateRecordPair;
try
{
Console.WriteLine("Updating the database...");
result = client.Update(updateArray);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
throw;
}
Console.WriteLine("Updated Record for {0}", updateRecordPair.Before.Name);
Console.WriteLine("The new name for the employee is {0}", updateRecordPair.After.Name);
Console.WriteLine("Press any key to continue ...");
Console.ReadLine();
削除操作。
次のコードは、Employee テーブルを対象とする Delete 操作を示しています。
int deleteSuccess;
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] deleteRecords =
new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[1];
deleteRecords = client.Select("*", "where [Employee_ID] = (select IDENT_CURRENT('Employee'))");
Console.WriteLine("Following employees will be deleted from the database:");
for (int i = 0; i < deleteRecords.Length; i++)
{
Console.WriteLine("Name: {0}", deleteRecords[i].Name);
}
Console.WriteLine("Press any key to begin deletion...");
Console.ReadLine();
try
{
Console.WriteLine("Deleting employee record...");
deleteSuccess = client.Delete(deleteRecords);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
throw;
}