Oracle-Sequenzen

Der .NET Framework-Datenanbieter für Oracle bietet Unterstützung für das Abrufen der vom Server generierten Oracle-Sequenz-Schlüsselwerte, nachdem mit OracleDataAdapter Einfügevorgänge ausgeführt wurden.

SQL Server und Oracle unterstützen die Erstellung von Spalten, die automatisch inkrementiert und für Primärschlüssel verwendet werden. Diese Werte werden vom Server generiert, wenn einer Tabelle Zeilen hinzugefügt werden. In SQL Server legen Sie die Identität einer Spalte fest, in Oracle erstellen Sie eine Sequenz. Zwischen den AutoIncrement-Spalten in SQL Server und den Sequenzen in Oracle besteht der folgende Unterschied:

  • In SQL Server markieren Sie eine Spalte als <legacyBold>AutoIncrement</legacyBold>-Spalte, woraufhin SQL Server automatisch neue Werte für die Spalte generiert, sobald eine neue Zeile eingefügt wird.

  • In Oracle erstellen Sie eine Sequenz, um neue Werte für eine Spalte in Ihrer Tabelle zu generieren, wobei es aber keine direkte Verknüpfung zwischen der Sequenz und der Tabelle bzw. Spalte gibt. Eine Oracle-Sequenz ist ein Objekt wie eine Tabelle oder eine gespeicherte Prozedur.

Wenn Sie in einer Oracle-Datenbank eine Sequenz erstellen, können Sie deren Erstwert und den Inkrementwert definieren. Sie können die Sequenz auch nach neuen Werten abfragen, bevor Sie neue Zeilen senden. Das bedeutet, Ihr Code kann die Schlüsselwerte für neue Zeilen erkennen, bevor Sie sie in die Datenbank einfügen.

Weitere Informationen zum Erstellen automatischer Inkrementspalten mit SQL Server und ADO.NET finden Sie unter Abrufen von Identitäts- oder Autonumber-Werten und Erstellen von AutoIncrement-Spalten.

Beispiel

Im folgenden C#-Beispiel wird gezeigt, wie Sie neue Sequenzwerte aus einer Oracle-Datenbank abrufen können. Im Beispiel wird auf die Sequenz in der INSERT INTO-Abfrage verwiesen, mit der die neuen Zeilen eingefügt werden. Daraufhin wird der Sequenzwert zurückgegeben, der mit der in Oracle10g eingeführten RETURNING-Klausel generiert wird. Das Beispiel fügt einer DataTable eine Reihe anstehender neuer Zeilen hinzu. Dabei kommt die ADO.NET-<legacyBold>AutoIncrement</legacyBold>-Funktionalität zum Einsatz, mit der "Platzhalter"-Primärschlüsselwerte generiert werden. Beachten Sie, dass der von ADO.NET generierte Inkrementwert für die neue Zeile lediglich ein "Platzhalter" ist. Die Datenbank generiert u. U. andere Werte als ADO.NET.

Bevor die anstehenden Einfügungen an die Datenbank gesendet werden, zeigt das Beispiel den Inhalt der Zeilen an. Der Code erstellt dann ein neues OracleDataAdapter-Objekt und richtet dessen Eigenschaften InsertCommand und UpdateBatchSize ein. Im Beispiel wird auch die Logik angegeben, mit der die vom Server generierten Werte unter Verwendung von Ausgabeparametern zurückgegeben werden. Anschließend wird das Update ausgeführt, indem die anstehenden Zeilen gesendet werden, und es wird der Inhalt der DataTable angezeigt.

public void OracleSequence(String connectionString)  
{  
   String insertString =
      "INSERT INTO SequenceTest_Table (ID, OtherColumn)" +  
      "VALUES (SequenceTest_Sequence.NEXTVAL, :OtherColumn)" +  
      "RETURNING ID INTO :ID";  
  
   using (OracleConnection conn = new OracleConnection(connectionString))  
   {  
      //Open a connection.  
      conn.Open();  
      OracleCommand cmd = conn.CreateCommand();  
  
      // Prepare the database.  
      cmd.CommandText = "DROP SEQUENCE SequenceTest_Sequence";  
      try { cmd.ExecuteNonQuery(); } catch { }  
  
      cmd.CommandText = "DROP TABLE SequenceTest_Table";  
      try { cmd.ExecuteNonQuery(); } catch { }  
  
      cmd.CommandText = "CREATE TABLE SequenceTest_Table " +  
                     "(ID int PRIMARY KEY, OtherColumn varchar(255))";  
      cmd.ExecuteNonQuery();  
  
      cmd.CommandText = "CREATE SEQUENCE SequenceTest_Sequence " +  
                        "START WITH 100 INCREMENT BY 5";  
      cmd.ExecuteNonQuery();  
  
      DataTable testTable = new DataTable();  
      DataColumn column = testTable.Columns.Add("ID", typeof(int));  
      column.AutoIncrement = true;  
      column.AutoIncrementSeed = -1;  
      column.AutoIncrementStep = -1;  
      testTable.PrimaryKey = new DataColumn[] { column };  
      testTable.Columns.Add("OtherColumn", typeof(string));  
      for (int rowCounter = 1; rowCounter <= 15; rowCounter++)  
      {  
         testTable.Rows.Add(null, "Row #" + rowCounter.ToString());  
      }  
  
      Console.WriteLine("Before Update => ");  
      foreach (DataRow row in testTable.Rows)  
      {  
         Console.WriteLine("   {0} - {1}", row["ID"], row["OtherColumn"]);  
      }  
      Console.WriteLine();  
  
      cmd.CommandText =
        "SELECT ID, OtherColumn FROM SequenceTest_Table";  
      OracleDataAdapter da = new OracleDataAdapter(cmd);  
      da.InsertCommand = new OracleCommand(insertString, conn);  
      da.InsertCommand.Parameters.Add(":ID", OracleType.Int32, 0, "ID");  
      da.InsertCommand.Parameters[0].Direction = ParameterDirection.Output;  
      da.InsertCommand.Parameters.Add(":OtherColumn", OracleType.VarChar, 255, "OtherColumn");  
      da.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;  
      da.UpdateBatchSize = 10;  
  
      da.Update(testTable);  
  
      Console.WriteLine("After Update => ");  
      foreach (DataRow row in testTable.Rows)  
      {  
         Console.WriteLine("   {0} - {1}", row["ID"], row["OtherColumn"]);  
      }  
      // Close the connection.  
      conn.Close();  
   }  
}  

Weitere Informationen