Einfügen, Aktualisieren, Löschen oder Auswählen von Vorgängen in Oracle Database mithilfe des WCF-Dienstmodells
Der Microsoft BizTalk-Adapter für Oracle-Datenbank enthält eine Reihe grundlegender Einfüge-, Update-, Delete- und Select-Vorgänge für Oracle-Datenbanktabellen und -sichten. Mithilfe dieser Vorgänge können Sie einfache SQL INSERT-, UPDATE-, SELECT- und DELETE-Anweisungen ausführen, die durch eine WHERE-Klausel für eine Zieltabelle oder -sicht qualifiziert sind. Um komplexere Vorgänge auszuführen, z. B. eine SQL SELECT-Abfrage, die den JOIN-Operator verwendet, können Sie den SQLEXECUTE-Vorgang verwenden. Weitere Informationen zum SQLEXECUTE-Vorgang finden Sie unter Ausführen eines SQLEXECUTE-Vorgangs in Oracle-Datenbank mithilfe des WCF-Dienstmodells.
In der folgenden Tabelle sind die grundlegenden SQL-Vorgänge zusammengefasst, die der Oracle Database-Adapter in Tabellen und Sichten anzeigt. Eine vollständige Beschreibung dieser Vorgänge finden Sie unter Nachrichtenschemas für die grundlegenden Vorgänge zum Einfügen, Aktualisieren, Löschen und Auswählen von Vorgängen für Tabellen und Sichten.
Vorgang | BESCHREIBUNG |
---|---|
Einfügen | Der Insert-Vorgang unterstützt mehrere Datensätze oder Masseneinfügungen in die Zieltabelle oder -sicht: – Bei einem Einfügevorgang mit mehreren Datensätzen werden Zeilen basierend auf einem angegebenen Datensatzsatz in eine Tabelle oder Sicht eingefügt. - Bei einem Masseneinfügungsvorgang werden Zeilen basierend auf einer bereitgestellten SQL SELECT-Abfrage und Spaltenliste in eine Tabelle oder Sicht eingefügt. Die von der Abfrage zurückgegebenen Datensätze werden basierend auf der Spaltenliste in die Zieltabelle eingefügt. |
Select | Führt eine SQL SELECT-Abfrage für die Zieltabelle basierend auf einer angegebenen Liste von Spaltennamen und einer Filterzeichenfolge aus, die eine SQL WHERE-Klausel angibt. |
Aktualisieren | Führt ein UPDATE für die Zieltabelle aus. Die zu aktualisierenden Datensätze werden durch eine Filterzeichenfolge angegeben, die eine SQL WHERE-Klausel angibt. Die Werte für das Update werden in einem Vorlagendatensatz angegeben. |
Löschen | Führt eine DELETE-Datei für die Zieltabelle basierend auf einer SQL WHERE-Klausel aus, die in einer Filterzeichenfolge angegeben ist. |
Informationen zu den in diesem Thema verwendeten Beispielen
In den Beispielen in diesem Thema wird die Tabelle /SCOTT/ACCOUNTACTIVITY verwendet. Ein Skript zum Generieren dieser Tabelle wird mit den SDK-Beispielen bereitgestellt. Weitere Informationen zu den SDK-Beispielen finden Sie unter Beispiele im SDK.
Die WCF-Clientklasse
Der Name des WCF-Clients, der für die grundlegenden SQL-Vorgänge generiert wird, die vom Oracle Database-Adapter angezeigt werden, basiert wie in der folgenden Tabelle auf dem Namen der Tabelle oder Sicht.
Oracle-Datenbankartefakt | WCF-Clientname |
---|---|
Tabelle | [SCHEMA] Table[TABLE_NAME]Client |
Sicht | [SCHEMA] View[VIEW_NAME]Client |
[SCHEMA] = Sammlung von Oracle-Artefakten; z. B. SCOTT.
[TABLE_NAME] = Der Name der Tabelle; z. B. ACCOUNTACTIVITY.
[VIEW_NAME] = Der Name der Ansicht.
Die folgende Tabelle zeigt die Methodensignaturen für die grundlegenden SQL-Vorgänge für eine Tabelle. Die Signaturen sind für eine Ansicht identisch, mit der Ausnahme, dass der Ansichtsnamespace und der Name die der Tabelle ersetzen.
Vorgang | Methodensignatur |
---|---|
Einfügen | long Insert([TABLE_NS].[ TABLE_NAME]RECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY); |
Select | [TABLE_NS]. [TABLE_NAME] RECORDSELECT[] Select(string COLUMN_NAMES, string FILTER); |
Aktualisieren | long Update([TABLE_NS].[ TABLE_NAME]RECORDUPDATE RECORDSET, ZeichenfolgenFILTER); |
Löschen | Long Delete(string FILTER); |
[TABLE_NS] = Der Name des Tabellennamespace; beispiel: microsoft.lobservices.oracledb._2007._03.SCOTT. Table.ACCOUNTACTIVITY.
[TABLE_NAME] = Der Name der Tabelle; z. B. ACCOUNTACTIVITY.
Die von den Vorgängen Einfügen, Aktualisieren und Auswählen verwendeten Datensatztypen sind alle im Tabellen- oder Sichtnamespace definiert.
Der folgende Code zeigt die Methodensignaturen für eine WCF-Clientklasse, die für die Vorgänge Delete, Insert, Select und Update in der Tabelle /SCOTT/ACCOUNTACTIVITY generiert wurde.
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);
}
Aufrufen der grundlegenden SQL-Vorgänge
Führen Sie die folgenden Schritte aus, um die grundlegenden SQL-Vorgänge für eine Tabelle oder Sicht mithilfe eines WCF-Clients aufzurufen.
Generieren Sie eine WCF-Clientklasse für die Zieltabelle oder -sicht. Diese Klasse sollte Methoden für die Vorgänge enthalten, die Sie für das Zielartefakt aufrufen.
Erstellen Sie eine instance der WCF-Clientklasse, und rufen Sie deren Methoden auf, um Vorgänge für die Tabelle oder Sicht auszuführen.
Ausführlichere Informationen zum Erstellen einer WCF-Clientklasse und zum Aufrufen von Vorgängen für den Oracle Database-Adapter finden Sie unter Übersicht über das WCF-Dienstmodell mit dem Oracle-Datenbankadapter.
Der Oracle Database-Adapter führt jeden Vorgang innerhalb einer Transaktion für die Oracle-Datenbank aus. Sie können die Isolationsstufe dieser Transaktion steuern, indem Sie die TransactionIsolationLevel-Bindungseigenschaft festlegen. Weitere Informationen zu den Bindungseigenschaften des Oracle Database-Adapters finden Sie unter Arbeiten mit BizTalk Adapter for Oracle Database Binding Properties.
Die folgenden Abschnitte enthalten Details zum Aufrufen der einzelnen grundlegenden SQL-Vorgänge in Ihrem Code.
Einfügungsvorgang
Die folgende Tabelle zeigt, wie Parameter für Mehrere Datensatzeinfügungs- und Masseneinfügungsvorgänge festgelegt werden.
Vorgangstyp einfügen | RECORDSET | COLUMN_NAMES | QUERY |
---|---|---|---|
Mehrere Datensätze | Eine Auflistung von INSERTRECORDS, die in das Ziel eingefügt werden soll. | NULL | NULL |
Massenvorgang | NULL | Eine durch Trennzeichen getrennte Liste von Spaltennamen im Ziel; beispiel: "TID, ACCOUNT". Die Spaltenliste gibt die Spalten an, in die die Abfrageergebnisse in jeder eingefügten Zeile eingefügt werden sollen. Die Abfrage muss ein Resultset zurückgeben, das den in der Spaltenliste angegebenen Spalten sowohl in Der Zahl als auch dem Typ entspricht. | Eine SQL SELECT-Abfrage für eine Datenbanktabelle oder -sicht, die ein Resultset zurückgibt, das in das Ziel eingefügt werden soll; Beispiel: "SELECT (TID, ACCOUNT) FROM NEW_TRANSACTIONS WHERE ACCOUNT = 100001". Das Resultset muss mit der Spaltenliste in Zahl und Typ übereinstimmen. |
Der Insert-Vorgang gibt die Anzahl der Datensätze zurück, die in das Ziel eingefügt wurden.
Wichtig
Im WCF-Dienstmodell ist der im Einfügevorgang verwendete Datensatzsatz stark typisiert. Sie können den Wert einer nillablen Spalte in einem Datensatz auf NULL festlegen, um diese Spalte aus dem Einfügevorgang auszuschließen. Sie können jedoch den Wert einer nicht nillierbaren Spalte nicht auf NULL festlegen. Dies bedeutet, dass Sie in einem Einfügevorgang mit mehreren Datensätzen Werte für alle nicht nillierbaren Spalten in jedem Datensatz angeben müssen. Darüber hinaus gibt es keine Streamingunterstützung für die grundlegenden SQL-Vorgänge, wenn Sie das WCF-Dienstmodell verwenden. Wenn Ihr Vorgang zum Einfügen mehrerer Datensätze einen großen Datensatzsatz umfasst, kann dies ein wichtiger Aspekt sein. Weitere Informationen finden Sie unter Einschränkungen beim Aufrufen der grundlegenden SQL-Vorgänge mithilfe des WCF-Dienstmodells.
Der folgende Code zeigt einen Mehrfachdatensatzeinfügungsvorgang (zwei Datensätze), der auf die TABELLE ACCOUNTACTIVITY ausgerichtet ist.
// 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);
Vorgang auswählen
In der folgenden Tabelle sind die Parameter für den Select-Vorgang aufgeführt.
COLUMN_NAMES | FILTER |
---|---|
Eine durch Trennzeichen getrennte Liste von Spaltennamen im Ziel; beispiel: "TID, ACCOUNT". Die Spaltenliste gibt die Spalten des Ziels an, die im Resultset zurückgegeben werden sollen. Spalten, die nicht in der Spaltenliste angegeben sind, werden im zurückgegebenen Datensatzsatz auf ihre .NET-Standardwerte festgelegt. Für nillable Spalten ist dieser Wert NULL. | Der Inhalt einer SQL WHERE-Klausel, die die Zielzeilen der Abfrage angibt; beispiel: "DESCRIPTION = 'Insert Record #1'". Sie können diesen Parameter auf NULL festlegen, um alle Zeilen des Ziels zurückzugeben. |
Der Select-Vorgang gibt einen stark typisierten Datensatzsatz basierend auf dem Zeilentyp des Ziels zurück.
Wichtig
Es gibt keine Streamingunterstützung für die grundlegenden SQL-Vorgänge, wenn Sie das WCF-Dienstmodell verwenden. Wenn Ihre Abfrage einen großen Datensatz zurückgibt, können Sie die Leistung möglicherweise mithilfe des WCF-Kanalmodells verbessern. Weitere Informationen finden Sie unter Einschränkungen des Aufrufens der grundlegenden SQL-Vorgänge mithilfe des WCF-Dienstmodells.
Der folgende Code zeigt einen Select-Vorgang, der auf die TABELLE ACCOUNTACTIVITY abzielt. Die zurückgegebenen Datensätze werden in die Konsole geschrieben.
// 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);
}
Hinweis
In diesem Code werden Die Schritte zum Erstellen, Konfigurieren und Öffnen des WCF-Clients instance weggelassen. Ein Beispiel, das diese Schritte enthält, finden Sie unter Einfügevorgang.
Updatevorgang
In der folgenden Tabelle sind die Parameter für den Updatevorgang aufgeführt.
RECORDSET | FILTER |
---|---|
Ein stark typisierter Vorlagendatensatz, der auf dem Zeilentyp des Ziels basiert. Der Vorlagendatensatz gibt die Aktualisierungswerte für die Zielzeilen an. Für nillierbare Zeilenspalten können Sie einen NULL-Wert angeben, um anzugeben, dass die Spalte nicht in den Zielzeilen aktualisiert werden soll. | Der Inhalt einer SQL WHERE-Klausel, die die zeilen angibt, die im Ziel aktualisiert werden sollen. Beispiel: "DESCRIPTION= 'Inserted Record #1'". |
Der Updatevorgang gibt die Anzahl der aus dem Ziel gelöschten Zeilen zurück.
Wichtig
Im WCF-Dienstmodell ist der vorlagenbasierte Datensatz, der im Updatevorgang verwendet wird, stark typisiert. Wenn eine Spalte nillierbar ist, können Sie die Spalte aus dem Updatevorgang weglassen, indem Sie ihren Wert im Vorlagendatensatz auf NULL festlegen. Wenn eine Spalte jedoch nicht nillierbar ist, müssen Sie ihren Wert im Vorlagendatensatz festlegen. Wenn eine Spalte beispielsweise ein Primärschlüssel ist, muss sie einen Wert enthalten. Weitere Informationen finden Sie unter Einschränkungen des Aufrufens der grundlegenden SQL-Vorgänge mithilfe des WCF-Dienstmodells.
Der folgende Code zeigt einen Updatevorgang, der auf die TABELLE ACCOUNTACTIVITY abzielt.
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);
Hinweis
In diesem Code werden Die Schritte zum Erstellen, Konfigurieren und Öffnen des WCF-Clients instance weggelassen. Ein Beispiel, das diese Schritte enthält, finden Sie unter Einfügevorgang.
Löschvorgang
In der folgenden Tabelle sind die Parameter für den Löschvorgang aufgeführt.
FILTER |
---|
Der Inhalt einer SQL WHERE-Klausel, die die Zeilen angibt, die aus dem Ziel gelöscht werden sollen. Beispiel: "DESCRIPTION= 'Inserted Record #1'". |
Der Delete-Vorgang gibt die Anzahl der aus dem Ziel gelöschten Zeilen zurück. Der folgende Code zeigt einen Delete-Vorgang, der auf die TABELLE ACCOUNTACTIVITY abzielt.
// 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);
Hinweis
In diesem Code werden Die Schritte zum Erstellen, Konfigurieren und Öffnen des WCF-Clients instance weggelassen. Ein Beispiel, das diese Schritte enthält, finden Sie im Einfügevorgang.
Einschränkungen beim Aufrufen grundlegender SQL-Vorgänge mithilfe des WCF-Dienstmodells
Die folgenden Einschränkungen bestehen, wenn Sie die grundlegenden SQL-Vorgänge mithilfe eines WCF-Clients aufrufen:
Einfügevorgang. Der Datensatzsatz, der in einem Einfügevorgang mit mehreren Datensätzen verwendet wird, ist stark typisiert und enthält daher alle Zeilenspalten. Der Oracle Database-Adapter interpretiert einen NULL-Wert in einem Datensatz so, dass die Spalte aus dem Einfügevorgang ausgeschlossen werden soll. Nicht nillierbare Spalten können jedoch nicht ausgeschlossen werden, da Sie sie nicht auf einen NULL-Wert festlegen können. Daher müssen Sie Werte für nicht nillierbare Spalten angeben, wenn Sie einen Einfügevorgang mit mehreren Datensätzen ausführen.
Einfügevorgang. Der Oracle Database-Adapter interpretiert einen DbNull-Wert in einer nillierbaren Datenspalte so, dass die Spalte aus einem Einfügevorgang mit mehreren Datensätzen ausgeschlossen werden sollte. Dies bedeutet, dass Sie in einem Einfügevorgang mit mehreren Datensätzen keine nillbare Spalte auf DbNull für die Oracle-Datenbank festlegen können.
Einfügevorgang. Es gibt keine Streamingunterstützung für Einfügevorgänge mit mehreren Datensätzen, die einen großen Datensatzsatz umfassen.
Aktualisierungsvorgang. Der in einem Update-Vorgang verwendete Vorlagendatensatz ist stark typisiert und enthält daher alle Zeilenspalten. Der Oracle Database-Adapter interpretiert einen NULL-Wert in diesem Datensatz so, dass die Spalte vom Updatevorgang ausgeschlossen werden soll. Jedoch können nicht nillierbare Spalten nicht ausgeschlossen werden, da sie nicht auf einen NULL-Wert festgelegt werden können. Daher müssen Sie Werte für nicht nillierbare Spalten angeben, wenn Sie einen Updatevorgang ausführen.
Aktualisierungsvorgang. Der Oracle Database-Adapter interpretiert einen DbNull-Wert in einer nillierbaren Datenspalte im Vorlagendatensatz so, dass die Spalte vom Vorgang ausgeschlossen werden soll. Dies bedeutet, dass Sie eine nillable Spalte nicht auf DbNull für die Oracle-Datenbank festlegen können, indem Sie den Update-Vorgang verwenden.
Vorgang auswählen. Es gibt keine Streamingunterstützung für SELECT-Abfragen, die einen großen Datensatzsatz zurückgeben.
In Szenarien, in denen diese Einschränkungen Herausforderungen darstellen, können Sie den Vorgang mithilfe des WCF-Kanalmodells aufrufen, weil:
Mithilfe des WCF-Kanalmodells können Sie bestimmte Datenspalten aus Update- und Einfügevorgängen ausschließen.
Das WCF-Kanalmodell bietet Streamingunterstützung auf Knotenebene für die grundlegenden SQL-Vorgänge, die der Oracle Database-Adapter verfügbar macht.
Weitere Informationen zur Verwendung des WCF-Kanalmodells mit dem Oracle Database-Adapter finden Sie unter Entwickeln von Oracle-Datenbankanwendungen mithilfe des WCF-Kanalmodells.
Weitere Informationen
Entwickeln von Oracle-Datenbankanwendungen mithilfe des WCF-Kanalmodells