共用方式為


使用 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 用戶端以對資料表執行作業

  1. 在 Visual Studio 中建立 Visual C# 專案。 針對本主題,建立主控台應用程式。

  2. 在 Employee 資料表上產生 Insert、Select、Update 和 Delete 作業的 WCF 用戶端類別。 如需產生 WCF 用戶端類別的詳細資訊,請參閱產生 WCF 用戶端或 WCF 服務合約以進行SQL Server成品

    重要

    產生 WCF 用戶端類別之前,請確定您已將 EnableBizTalkCompatibilityMode 系結屬性設定為 false。

  3. 在方案總管中,新增 和 Microsoft.ServiceModel.ChannelsMicrosoft.Adapters.Sql 參考。

  4. 開啟 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 配接器的用戶端系結

  5. 開啟用戶端,如下列程式碼片段所述:

    try  
    {  
       Console.WriteLine("Opening Client...");  
       client.Open();  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine("Exception: " + ex.Message);  
       throw;  
    }  
    
  6. 叫用 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 作業。 您也可以附加程式碼片段,以在單一應用程式中執行所有作業。 如需如何執行這些作業的程式碼片段。

  7. 關閉用戶端,如下列程式碼片段所述:

    client.Close();  
    Console.WriteLine("Press any key to exit...");  
    Console.ReadLine();  
    
  8. 建置專案,然後加以執行。 應用程式會在 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;  
}  

另請參閱

使用 WCF 服務模型開發應用程式