使用 WCF 服務模型在 Oracle 資料庫中插入、更新、刪除或選取作業
Microsoft BizTalk Adapter for Oracle Database 會呈現一組基本的 Insert、Update、Delete 和 Select 作業,以在 Oracle 資料庫資料表和檢視上執行。 藉由使用這些作業,您可以在目標資料表或檢視表上執行 WHERE 子句限定的簡單 SQL INSERT、UPDATE、SELECT 和 DELETE 子句。 若要執行更複雜的作業,例如使用 JOIN 運算子的 SQL SELECT 查詢,您可以使用 SQLEXECUTE 作業。 如需 SQLEXECUTE 作業的詳細資訊,請參閱 使用 WCF 服務模型在 Oracle 資料庫中執行 SQLEXECUTE 作業。
下表摘要說明 Oracle 資料庫配接器在資料表和檢視表上呈現的基本 SQL 作業。 如需這些作業的完整描述,請參閱 基本插入、更新、刪除和選取資料表和檢視表作業的訊息架構。
作業 | 描述 |
---|---|
插入 | Insert 作業支援多個記錄或大量插入目標資料表或檢視: - 多個記錄 插入作業會根據提供的記錄集,將資料列插入資料表或檢視中。 - 大量插入作業會根據提供的 SQL SELECT 查詢和資料行清單,將資料列插入資料表或檢視中。 查詢傳回的記錄會根據資料行清單插入目標資料表中。 |
選取 | 根據提供的資料行名稱清單和指定 SQL WHERE 子句的篩選字串,在目標資料表上執行 SQL SELECT 查詢。 |
更新 | 在目標資料表上執行 UPDATE。 要更新的記錄是由指定 SQL WHERE 子句的篩選字串所指定。 更新的值會在範本記錄中指定。 |
刪除 | 根據篩選字串中指定的 SQL WHERE 子句,在目標資料表上執行 DELETE。 |
關於本主題中使用的範例
本主題中的範例使用 /SCOTT/ACCOUNTACTIVITY 資料表。 產生此資料表的腳本會隨附 SDK 範例。 如需 SDK 範例的詳細資訊,請參閱 SDK 中的範例。
WCF 用戶端類別
針對 Oracle Database 配接器介面的基本 SQL 作業所產生的 WCF 用戶端名稱,如下表所示。
Oracle 資料庫成品 | WCF 用戶端名稱 |
---|---|
資料表 | [SCHEMA]Table[TABLE_NAME]Client |
檢視 | [SCHEMA]View[VIEW_NAME]Client |
[SCHEMA] = Oracle 成品的集合;例如,SCOTT。
[TABLE_NAME] = 資料表的名稱;例如,ACCOUNTACTIVITY。
[VIEW_NAME] = 檢視的名稱。
下表顯示資料表上基本 SQL 作業的方法簽章。 檢視的簽章相同,不同之處在于檢視命名空間和名稱會取代資料表的簽章。
作業 | 方法簽章 |
---|---|
插入 | long Insert ([TABLE_NS]。[TABLE_NAME]RECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY) ; |
選取 | [TABLE_NS]。[TABLE_NAME]RECORDSELECT[] 選取 (字串COLUMN_NAMES,字串 FILTER) ; |
更新 | long Update ([TABLE_NS]。[TABLE_NAME]RECORDUPDATE RECORDSET,字串 FILTER) ; |
刪除 | Long Delete (string FILTER) ; |
[TABLE_NS] = 資料表命名空間的名稱;例如,microsoft.lobservices.oracledb._2007._03.SCOTT。Table.ACCOUNTACTIVITY。
[TABLE_NAME] = 資料表的名稱;例如,ACCOUNTACTIVITY。
Insert、Update 和 Select 作業所使用的記錄類型全都定義在資料表或檢視命名空間中。
下列程式碼顯示針對 /SCOTT/ACCOUNTACTIVITY 資料表上針對 Delete、Insert、Select 和 Update 作業產生的 WCF 用戶端類別的方法簽章。
public partial class SCOTTTableACCOUNTACTIVITYClient : System.ServiceModel.ClientBase<SCOTTTableACCOUNTACTIVITY>, SCOTTTableACCOUNTACTIVITY {
public long Delete(string FILTER);
public long Insert(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY);
public microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] Select(string COLUMN_NAMES, string FILTER);
public long Update(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE RECORDSET, string FILTER);
}
叫用基本 SQL 作業
若要使用 WCF 用戶端在資料表或檢視上叫用基本 SQL 作業,請執行下列步驟。
產生目標資料表或檢視表的 WCF 用戶端類別。 這個類別應該包含您將在目標成品上叫用之作業的方法。
建立 WCF 用戶端類別的實例,並叫用其方法來對資料表或檢視表執行作業。
如需如何在 Oracle 資料庫配接器上建立 WCF 用戶端類別和叫用作業的詳細資訊,請參閱 使用 Oracle 資料庫配接器來建立 WCF 服務模型的概觀。
Oracle Database 配接器會在 Oracle 資料庫上的交易內執行每個作業。 您可以藉由設定 TransactionIsolationLevel 系結屬性來控制此交易的隔離等級。 如需 Oracle 資料庫配接器系結屬性的詳細資訊,請參閱 使用 BizTalk Adapter for Oracle 資料庫系結屬性。
下列各節提供如何在程式碼中叫用每個基本 SQL 作業的詳細資料。
插入動作
下表顯示如何設定多個記錄的 [插入] 和 [大量插入] 作業的參數。
插入作業類型 | 記錄 | COLUMN_NAMES | QUERY |
---|---|---|---|
多筆記錄 | 應插入目標之 INSERTRECORDS 的集合。 | null | null |
大量 | null | 目標中資料行名稱的逗號分隔清單;例如,「TID, ACCOUNT」。 資料行清單會指定查詢結果應該放在每個插入資料列中的資料行。 此查詢必須傳回符合數位和類型之資料行清單中所指定資料行的結果集。 | 資料庫資料表或檢視表上的 SQL SELECT 查詢,傳回要插入目標的結果集;例如,「SELECT (TID, ACCOUNT) FROM NEW_TRANSACTIONS WHERE ACCOUNT = 100001」。 結果集必須符合數位和類型的資料行清單。 |
Insert 作業會傳回插入目標中的記錄數目。
重要
在 WCF 服務模型中,插入作業中使用的記錄集是強型別的。 您可以將可為 nillable 資料行的值設定為記錄中的 null ,以從 Insert 作業中排除該資料行;不過,您無法將不可 nillable 資料行的值設定為 null。 這表示在多個記錄插入作業中,您必須為每個記錄中的所有不可輸出資料行提供值。 此外,當您使用 WCF 服務模型時,基本 SQL 作業沒有串流支援。 如果您的多個記錄插入作業牽涉到大型記錄集,這可能是重要的考慮。 如需詳細資訊,請參閱 使用 WCF 服務模型叫用基本 SQL 作業的限制。
下列程式碼顯示多個記錄 Insert 作業, (以 ACCOUNTACTIVITY 資料表為目標的兩筆記錄) 。
// Insert records
using (SCOTTTableACCOUNTACTIVITYClient aaTableClient =
new SCOTTTableACCOUNTACTIVITYClient("OracleDBBinding_SCOTT.Table.ACCOUNTACTIVITY"))
{
long recsInserted;
aaTableClient.ClientCredentials.UserName.UserName = "SCOTT";
aaTableClient.ClientCredentials.UserName.Password = "TIGER";
try
{
aaTableClient.Open();
}
catch (Exception ex)
{
// handle exception
Console.WriteLine("Exception: " + ex.Message);
throw;
}
// Do a multiple record Insert of 2 records for account 100001
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] insertRecs =
new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[2];
TID__COMPLEX_TYPE tid = new TID__COMPLEX_TYPE();
tid.InlineValue = "tidSequence.NextVal()";
ACCOUNT__COMPLEX_TYPE account = new ACCOUNT__COMPLEX_TYPE();
account.Value = 100001;
AMOUNT__COMPLEX_TYPE amount = new AMOUNT__COMPLEX_TYPE();
amount.Value = 400;
TRANSDATE__COMPLEX_TYPE transdate = new TRANSDATE__COMPLEX_TYPE();
transdate.Value = DateTime.Now.Date;
PROCESSED__COMPLEX_TYPE processed = new PROCESSED__COMPLEX_TYPE();
processed.Value = "n";
DESCRIPTION__COMPLEX_TYPE description1 = new DESCRIPTION__COMPLEX_TYPE();
description1.Value = "Inserted Record #1";
DESCRIPTION__COMPLEX_TYPE description2 = new DESCRIPTION__COMPLEX_TYPE();
description2.Value = "Inserted Record #2";
insertRecs[0] =
new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();
insertRecs[0].TID = tid;
insertRecs[0].ACCOUNT = account;
insertRecs[0].AMOUNT = amount;
insertRecs[0].TRANSDATE = transdate;
insertRecs[0].DESCRIPTION = description1;
insertRecs[0].PROCESSED = processed;
insertRecs[1] =
new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();
insertRecs[1].TID = tid;
insertRecs[1].ACCOUNT = account;
insertRecs[1].AMOUNT = amount;
insertRecs[1].TRANSDATE = transdate;
insertRecs[1].DESCRIPTION = description2;
insertRecs[1].PROCESSED = processed;
try
{
recsInserted = aaTableClient.Insert(insertRecs, null, null);
}
catch (Exception ex)
{
// handle exception
Console.WriteLine("Exception: " + ex.Message);
throw;
}
Console.WriteLine("Insert Done: {0} records inserted", recsInserted);
選取作業
下表顯示 Select 作業的參數。
COLUMN_NAMES | FILTER |
---|---|
目標中資料行名稱的逗號分隔清單;例如,「TID, ACCOUNT」。 資料行清單會指定結果集中應該傳回的目標資料行。 資料行清單中未指定的資料行將會設定為傳回記錄集中的 .NET 預設值。 對於可為 nillable的資料行,此值為 null。 | 指定查詢目標資料列之 SQL WHERE 子句的內容;例如,「DESCRIPTION = 'Insert Record #1'」。 您可以將此參數設定為 null ,以傳回目標的所有資料列。 |
Select 作業會根據目標的資料列類型傳回強型別記錄集。
重要
當您使用 WCF 服務模型時,基本 SQL 作業沒有串流支援。 如果您的查詢傳回大型記錄集,您可以使用 WCF 通道模型來改善效能。 如需詳細資訊,請參閱 使用 WCF 服務模型叫用基本 SQL 作業的限制。
下列程式碼顯示以 ACCOUNTACTIVITY 資料表為目標的 Select 作業。 傳回的記錄會寫入主控台。
// Declare a variable to hold the result set
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] selectRecords;
// Select all records and write them to the console
try
{
selectRecords = aaTableClient.Select("*", null);
}
catch (Exception ex)
{
// handle exception
}
Console.WriteLine("ACCOUNTACTIVITY before any operations");
for (int i = 0; i \< selectRecords.Length; i++)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", selectRecords[i].TID,
selectRecords[i].ACCOUNT,
selectRecords[i].AMOUNT,
selectRecords[i].TRANSDATE,
selectRecords[i].DESCRIPTION);
}
注意
此程式碼會省略建立、設定及開啟 WCF 用戶端實例的步驟。 如需包含這些步驟的範例,請參閱 插入作業。
更新作業
下表顯示更新作業的參數。
記錄 | FILTER |
---|---|
以目標的資料列類型為基礎的強型別範本記錄。 範本記錄會指定目標資料列的更新值。 針對可為 nillable 的資料列資料行,您可以指定 Null 值,以指出該資料行不應該在目標資料列中更新。 | SQL WHERE 子句的內容,指定要在目標中更新的資料列。 例如,「DESCRIPTION= 'Inserted Record #1'」。 |
Update 作業會傳回從目標中刪除的資料列數目。
重要
在 WCF 服務模型中,更新作業中使用的範本記錄是強型別的。 如果資料行為 nillable,您可以在範本記錄中將其值設定為 null ,以省略 Update 作業中的資料行;不過,如果資料行無法運作,則必須在範本記錄中設定其值。 例如,如果資料行是主鍵,則必須包含值。 如需詳細資訊,請參閱 使用 WCF 服務模型叫用基本 SQL 作業的限制。
下列程式碼顯示以 ACCOUNTACTIVITY 資料表為目標的更新作業。
long recsUpdated;
...
// Create updated template. The TID, TIME, AMOUNT, and DESCRIPTION fields will be updated
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE updateRecord =
new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE();
updateRecord.TID = tidSequence.NextVal();
updateRecord.ACCOUNT = null;
updateRecord.AMOUNT = 300;
updateRecord.TRANSDATE = DateTime.Now.Date;
updateRecord.DESCRIPTION = "Updated Record #2";
updateRecord.PROCESSED = null;
// Set filter string to specify the target record by using the DESCRIPTION field
string filter = "DESCRIPTION = 'Inserted Record #2'";
try
{
recsUpdated = aaTableClient.Update(updateRecord, filter);
}
catch (Exception ex)
{
// handle exception
...
}
Console.WriteLine("{0} records updated", recsUpdated);
注意
此程式碼會省略建立、設定及開啟 WCF 用戶端實例的步驟。 如需包含這些步驟的範例,請參閱 插入作業。
刪除作業
下表顯示 Delete 作業的參數。
FILTER |
---|
SQL WHERE 子句的內容,指定要從目標中刪除的資料列。 例如,「DESCRIPTION= 'Inserted Record #1'」。 |
Delete 作業會傳回從目標中刪除的資料列數目。 下列程式碼顯示以 ACCOUNTACTIVITY 資料表為目標的 Delete 作業。
// Set filter string equal to the DESCRIPTION field of the target record
string filter = "DESCRIPTION = 'Inserted Record #1'";
try
{
recsDeleted = aaTableClient.Delete(filter);
}
catch (Exception ex)
{
// handle exception
...
}
Console.WriteLine("{0} records deleted", recsDeleted);
注意
此程式碼會省略建立、設定及開啟 WCF 用戶端實例的步驟。 如需包含這些步驟的範例,請參閱 插入作業。
使用 WCF 服務模型叫用基本 SQL 作業的限制
當您使用 WCF 用戶端叫用基本 SQL 作業時,有下列限制:
插入作業。 在多個記錄 Insert 作業中使用的記錄集是強型別的,因此會包含所有資料列資料行。 Oracle 資料庫配接器會解譯記錄中的 Null 值,表示資料行應該從 Insert 作業中排除;不過,無法排除非 nillable 資料行,因為您無法將它們設定為 Null 值。 因此,當您執行多個記錄 Insert 作業時,您必須指定不可為 Nillable 資料行的值。
插入作業。 Oracle 資料庫配接器會解譯 nillable 資料行中的 DbNull 值,表示應該從多個記錄 Insert 作業中排除該資料行。 這表示您無法在多個記錄的 Insert 作業中,將 Oracle 資料庫上的 Nillable 資料行設定為 DbNull 。
插入作業。 對於涉及大型記錄集的多個記錄插入作業,沒有串流支援。
更新作業。 更新作業中使用的範本記錄是強型別的,因此會包含所有資料列資料行。 Oracle 資料庫配接器會解譯此記錄中的 Null 值,表示資料行應該從更新作業中排除;不過,無法排除非 nillable 資料行,因為您無法將它們排除為 Null 值。 因此,當您執行 Update 作業時,您必須指定不可為 Nillable 資料行的值。
更新作業。 Oracle 資料庫配接器會解譯範本記錄中 nillable 資料行中的 DbNull 值,表示該資料行應該從作業中排除。 這表示您無法使用 Update 作業,將 Oracle 資料庫上的 Nillable 資料行設定為 DbNull 。
選取作業。 沒有傳回大型記錄集之 SELECT 查詢的串流支援。
對於這些限制存在挑戰的案例,您可以使用 WCF 通道模型叫用作業,因為:
藉由使用 WCF 通道模型,您可以從 [更新] 和 [插入] 作業中排除特定資料行。
WCF 通道模型提供 Oracle 資料庫配接器公開之基本 SQL 作業的節點層級串流支援。
如需搭配 Oracle 資料庫配接器使用 WCF 通道模型的詳細資訊,請參閱 使用 WCF 通道模型開發 Oracle 資料庫應用程式。