使用 WCF 服務模型在 SQL 中插入、更新、刪除或選取作業
Microsoft BizTalk Adapter for SQL Server會探索一組SQL Server資料庫資料表和檢視的基本插入、選取、更新和刪除作業。 藉由使用這些作業,您可以在目標資料表或檢視表上執行 Where 子句限定的簡單 SQL Insert、Select、Update 和 Delete 語句。 本主題提供如何使用 WCF 服務模型執行這些作業的指示。
如需配接器如何支援這些作業的詳細資訊,請參閱使用 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][] 資料列) ; |
選取 | [TABLE_NS]。[TABLE_NAME][] 選取 (字串 COLUMNS、字串 QUERY) ; |
更新 | int Update ([TABLE_NS]。[TABLE_NAME]。RowPair[] 資料列) ; |
刪除 | 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 資料型別的陣列,並儲存插入資料列的識別值,如果有的話。 如果資料表中沒有識別資料行,則傳回值為 Null。
選取作業
COLUMN_NAMES | QUERY |
---|---|
目標中資料行名稱的逗號分隔清單;例如,「Employee_ID,指定」。 資料行清單會指定結果集中應該傳回的目標資料行。 資料行清單中未指定的資料行將會設定為傳回記錄集中的 .NET 預設值。 對於可為 nillable的資料行,此值為 null。 | 指定查詢目標資料列之 SQL WHERE 子句的內容;例如,「指定 = 'Manager'」。 您可以將此參數設定為 null ,以傳回目標的所有資料列。 |
Select 作業的傳回值是強型別的結果集,其中包含目標資料表或檢視中的指定資料行和資料列。
更新作業
配對的第一列 | 配對的第二列 |
---|---|
記錄組的第一筆記錄會對應至需要更新的新值,也就是說,它會對應至 UPDATE 語句的 SET 子句。 這可以使用 來設定 RowPair.After 。 |
記錄組的第二筆記錄會對應至資料列的舊值,也就是對應至 UPDATE 語句的 WHERE 子句。 這可以使用 來設定 RowPair.Before 。 |
Update 作業的傳回值為 Int32 資料類型,表示更新的資料列數目。
重要
指定必須更新的記錄時,即使您未更新所有值,您也必須提供所有資料行的值。 例如,如果資料列有五個數據行,而 Update 作業只會更新 2 個數據行,作為 RowPair.Before 的一部分,您必須傳遞所有 5 個數據行值。 不過,針對 RowPair.After,您只能指定將更新的資料行。
刪除作業
Delete 作業會接受輸入強型別的記錄陣列。 Delete 作業的傳回值是 Int32 資料類型,表示已刪除的資料列數目。
建立 WCF 用戶端以叫用資料表和檢視上的作業
使用 WCF 用戶端在SQL Server上執行作業所需的一般動作集,牽涉到使用 SQL 配接器之 WCF 服務模型概觀中所述的一組工作。 本節描述如何建立 WCF 用戶端,以叫用資料表上的基本插入、選取、更新、刪除作業。
若要建立 WCF 用戶端以對資料表執行作業
在 Visual Studio 中建立 Visual C# 專案。 針對本主題,建立主控台應用程式。
在 Employee 資料表上產生 Insert、Select、Update 和 Delete 作業的 WCF 用戶端類別。 如需產生 WCF 用戶端類別的詳細資訊,請參閱產生 WCF 用戶端或 WCF 服務合約以進行SQL Server成品。
重要
產生 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 中。此檔案也會由 [新增配接器服務參考外掛程式] 產生,並包含系結屬性和其他組態設定。注意
在此程式碼片段中,您會使用組態檔中的系結和端點位址。 您也可以在程式碼中明確指定這些值。 如需指定用戶端系結之不同方式的詳細資訊,請參閱 設定 SQL 配接器的用戶端系結。
開啟用戶端,如下列程式碼片段所述:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
叫用 Employee 資料表上的 Insert 作業。
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 作業。 您也可以附加程式碼片段,以在單一應用程式中執行所有作業。 如需如何執行這些作業的程式碼片段。
關閉用戶端,如下列程式碼片段所述:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
建置專案,然後加以執行。 應用程式會在 Employee 資料表中插入記錄。
選取作業
下列程式碼顯示以 Employee 資料表為目標的 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 資料表為目標的更新作業。
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;
}