Freigeben über


OracleDataAdapter-Klasse

Stellt eine Gruppe von Datenbefehlen und eine Verbindung mit der Datenbank dar, die zum Auffüllen des DataSet und zum Aktualisieren der Datenbank verwendet werden. Die Klasse kann nicht geerbt werden.

Namespace: System.Data.OracleClient
Assembly: System.Data.OracleClient (in system.data.oracleclient.dll)

Syntax

'Declaration
Public NotInheritable Class OracleDataAdapter
    Inherits DbDataAdapter
    Implements IDbDataAdapter, IDataAdapter, ICloneable
'Usage
Dim instance As OracleDataAdapter
public sealed class OracleDataAdapter : DbDataAdapter, IDbDataAdapter, IDataAdapter, ICloneable
public ref class OracleDataAdapter sealed : public DbDataAdapter, IDbDataAdapter, IDataAdapter, ICloneable
public final class OracleDataAdapter extends DbDataAdapter implements IDbDataAdapter, IDataAdapter, 
    ICloneable
public final class OracleDataAdapter extends DbDataAdapter implements IDbDataAdapter, IDataAdapter, 
    ICloneable

Hinweise

Der OracleDataAdapter bildet eine Verbindung zwischen einem DataSet und einer Datenbank, über die Daten abgerufen und gespeichert werden. Der OracleDataAdapter stellt diese Verbindung bereit, indem er mit Fill Daten aus der Datenbank in das DataSet lädt und im DataSet vorgenommene Änderungen mit Update zurück an die Datenquelle sendet.

Wenn der OracleDataAdapter ein DataSet füllt, erstellt er die für die zurückgegebenen Daten erforderlichen Tabellen und Spalten, sofern diese nicht bereits vorhanden sind. Primärschlüsselinformationen sind jedoch im implizit erstellten Schema nur enthalten, wenn die MissingSchemaAction-Eigenschaft auf AddWithKey festgelegt ist. Das Schema von DataSet kann, einschließlich Primärschlüsselinformationen, auch durch den OracleDataAdapter erstellt werden, bevor es mithilfe von FillSchema mit Daten gefüllt wird. Weitere Informationen finden Sie unter Hinzufügen vorhandener Einschränkungen zu einem DataSet.

Hinweis

Standardmäßig werden numerische Felder, die mithilfe von Fill in eine DataTable importiert werden, OracleNumber-Objekten zugeordnet. Ein Überlauf der OracleNumber sowie das Auslösen einer Oracle-Ausnahme sind möglich, wenn ein numerischer Nicht-Ganzzahltyp importiert wird, der entweder zu groß ist oder eine zu hohe Genauigkeit für die Genauigkeitseinschränkungen der OracleNumber aufweist. Weitere Informationen finden Sie in der Beschreibung zu OracleNumber.

Der OracleDataAdapter enthält außerdem die Eigenschaften SelectCommand, InsertCommand, DeleteCommand, UpdateCommand und TableMappings, mit denen das Laden und Aktualisieren von Daten ermöglicht wird.

Der .NET Framework-Datenprovider für Oracle unterstützt keine SQL-Stapelanweisungen. Er ermöglicht jedoch die Verwendung mehrerer REF CURSOR-Ausgabeparameter zum Füllen eines DataSet in der jeweils eigenen DataTable. Sie müssen die Parameter definieren, diese als Ausgabeparameter markieren und angeben, dass sie REF CURSOR-Datentypen sind. Beachten Sie, dass die Update-Methode nicht verwendet werden kann. wenn der OracleDataAdapter mithilfe von REF CURSOR-Parametern gefüllt wird, die von einer gespeicherten Prozedur zurückgegeben werden, da von Oracle nicht die erforderlichen Informationen zum Bestimmen des Tabellennamens und der Spaltennamen bei Ausführung der SQL-Anweisung bereitgestellt werden. Im folgenden C#-Beispiel wird davon ausgegangen, dass folgende gespeicherte Prozedur erstellt wurde:

Erstellen Sie das folgende Oracle-Paket auf dem Oracle-Server.

CREATE OR REPLACE PACKAGE CURSPKG AS 
   TYPE T_CURSOR IS REF CURSOR; 
   PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, 
      IO_CURSOR OUT T_CURSOR); 
   PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
      DEPTCURSOR OUT T_CURSOR);
END CURSPKG;
/

Erstellen Sie den folgenden Oracle-Paketkörper auf dem Oracle-Server.

CREATE OR REPLACE PACKAGE BODY CURSPKG AS 
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, 
                               IO_CURSOR OUT T_CURSOR) 
    IS 
        V_CURSOR T_CURSOR; 
    BEGIN 
        IF N_EMPNO <> 0 THEN 
             OPEN V_CURSOR FOR 
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                  FROM EMP, DEPT 
                  WHERE EMP.DEPTNO = DEPT.DEPTNO 
                        AND EMP.EMPNO = N_EMPNO; 
        ELSE 
             OPEN V_CURSOR FOR 
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                  FROM EMP, DEPT 
                  WHERE EMP.DEPTNO = DEPT.DEPTNO; 
        END IF; 
        IO_CURSOR := V_CURSOR; 
    END OPEN_ONE_CURSOR; 
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
                                DEPTCURSOR OUT T_CURSOR) 
    IS 
        V_CURSOR1 T_CURSOR; 
        V_CURSOR2 T_CURSOR; 
    BEGIN 
        OPEN V_CURSOR1 FOR SELECT * FROM EMP; 
        OPEN V_CURSOR2 FOR SELECT * FROM DEPT; 
        EMPCURSOR  := V_CURSOR1; 
        DEPTCURSOR := V_CURSOR2; 
    END OPEN_TWO_CURSORS; 
END CURSPKG;
 /

Das folgende C#-Beispiel veranschaulicht, wie Sie mit der gespeicherten Prozedur Tabellen- und Spalteninformationen abrufen können.

// GetConnectionString() returns a connection string for
// the data source.

string connString = GetConnectionString();
DataSet ds = new DataSet();
OracleConnection conn = new OracleConnection(connString);
OracleCommand cmd = conn.CreateCommand();

cmd.CommandText = "CURSPKG.OPEN_TWO_CURSORS";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = 
       ParameterDirection.Output;
cmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = 
       ParameterDirection.Output;

OracleDataAdapter da = new OracleDataAdapter(cmd);
da.TableMappings.Add("Table", "Emp");
da.TableMappings.Add("Table1", "Dept");
da.Fill(ds);

ds.Relations.Add("EmpDept", ds.Tables["Dept"].Columns["Deptno"], 
      ds.Tables["Emp"].Columns["Deptno"], false);

Das folgende Visual Basic-Beispiel veranschaulicht, wie Sie einen OracleDataAdapter verwenden, um ein DataSet mithilfe von Oracle-REF CURSOR zu füllen. In diesen Beispielen werden Tabellen verwendet, die gemäß dem Oracle Scott/Tiger-Schema definiert sind und für die das folgende PL/SQL-Paket und der folgende Paketkörper erforderlich sind. Sie müssen diese auf dem Server erstellen, um die Beispiele ausführen zu können.

Erstellen Sie das folgende Oracle-Paket auf dem Oracle-Server.

CREATE OR REPLACE PACKAGE CURSPKG AS 
   TYPE T_CURSOR IS REF CURSOR; 
   PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, 
      IO_CURSOR OUT T_CURSOR); 
   PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
      DEPTCURSOR OUT T_CURSOR);
END CURSPKG;
/

Erstellen Sie den folgenden Oracle-Paketkörper auf dem Oracle-Server.

CREATE OR REPLACE PACKAGE BODY CURSPKG AS 
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, 
                               IO_CURSOR OUT T_CURSOR) 
    IS 
        V_CURSOR T_CURSOR; 
    BEGIN 
        IF N_EMPNO <> 0 THEN 
             OPEN V_CURSOR FOR 
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                  FROM EMP, DEPT 
                  WHERE EMP.DEPTNO = DEPT.DEPTNO 
                        AND EMP.EMPNO = N_EMPNO; 
        ELSE 
             OPEN V_CURSOR FOR 
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME 
                  FROM EMP, DEPT 
                  WHERE EMP.DEPTNO = DEPT.DEPTNO; 
        END IF; 
        IO_CURSOR := V_CURSOR; 
    END OPEN_ONE_CURSOR; 
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
                                DEPTCURSOR OUT T_CURSOR) 
    IS 
        V_CURSOR1 T_CURSOR; 
        V_CURSOR2 T_CURSOR; 
    BEGIN 
        OPEN V_CURSOR1 FOR SELECT * FROM EMP; 
        OPEN V_CURSOR2 FOR SELECT * FROM DEPT; 
        EMPCURSOR  := V_CURSOR1; 
        DEPTCURSOR := V_CURSOR2; 
    END OPEN_TWO_CURSORS; 
END CURSPKG;
 /

In diesem Visual Basic-Beispiel wird eine gespeicherte PL/SQL-Prozedur ausgeführt, die zwei REF CURSOR-Parameter zurückgibt. Außerdem wird ein DataSet mit den zurückgegebenen Zeilen gefüllt.

' GetConnectionString() returns a connection string for
' the data source.

    Dim connString As New String(GetConnectionString())
    Dim ds As New DataSet()
    Dim conn As New OracleConnection(connString)
    Dim cmd As OracleCommand = conn.CreateCommand()

    cmd.CommandText = "CURSPKG.OPEN_TWO_CURSORS"
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = _
       ParameterDirection.Output
    cmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = _
       ParameterDirection.Output

    Dim da As New OracleDataAdapter(cmd)
    da.TableMappings.Add("Table", "Emp")
    da.TableMappings.Add("Table1", "Dept")
    da.Fill(ds)

    ds.Relations.Add("EmpDept", ds.Tables("Dept").Columns("Deptno"), _
      ds.Tables("Emp").Columns("Deptno"), False)

Nach dem Verwenden des OracleDataAdapter zum Durchführen einer Fill-Operation oder einer FillSchema-Operation gibt die DataColumn.ReadOnly-Eigenschaft immer False zurück, unabhängig davon, ob die Spalte aktualisiert werden kann, da der Oracle-Server diese Informationen nicht zurückgibt.

Vererbungshierarchie

System.Object
   System.MarshalByRefObject
     System.ComponentModel.Component
       System.Data.Common.DataAdapter
         System.Data.Common.DbDataAdapter
          System.Data.OracleClient.OracleDataAdapter

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1

Siehe auch

Referenz

OracleDataAdapter-Member
System.Data.OracleClient-Namespace
OracleConnection-Klasse
OracleCommand-Klasse