Sekwencje Oracle

Program .NET Framework Dostawca danych for Oracle zapewnia obsługę pobierania wartości sekwencji Oracle wygenerowanych przez serwer po wykonaniu operacji wstawiania przy użyciu elementu OracleDataAdapter.

Programy SQL Server i Oracle obsługują tworzenie automatycznie zwiększanych kolumn, które mogą być oznaczone jako klucze podstawowe. Te wartości są generowane przez serwer w miarę dodawania wierszy do tabeli. W programie SQL Server należy ustawić właściwość Identity kolumny; w programie Oracle utworzysz sekwencję. Różnica między kolumnami automatycznego zwiększania w programie SQL Server i sekwencjami w programie Oracle polega na tym, że:

  • W programie SQL Server kolumna jest oznaczana jako kolumna automatycznego zwiększania, a program SQL Server automatycznie generuje nowe wartości dla kolumny podczas wstawiania nowego wiersza.

  • W programie Oracle utworzysz sekwencję w celu wygenerowania nowych wartości dla kolumny w tabeli, ale nie ma bezpośredniego połączenia między sekwencją a tabelą lub kolumną. Sekwencja Oracle to obiekt, taki jak tabela lub procedura składowana.

Podczas tworzenia sekwencji w bazie danych Oracle można zdefiniować jej wartość początkową i przyrost między jej wartościami. Możesz również wykonać zapytanie dotyczące sekwencji nowych wartości przed przesłaniem nowych wierszy. Oznacza to, że kod może rozpoznać wartości kluczy dla nowych wierszy przed wstawieniem ich do bazy danych.

Aby uzyskać więcej informacji na temat tworzenia kolumn automatycznego zwiększania przy użyciu programu SQL Server i ADO.NET, zobacz Pobieranie wartości tożsamości lub autonumerowania oraz Tworzenie kolumn autoinkrementacji.

Przykład

W poniższym przykładzie języka C# pokazano, jak można pobrać nowe wartości sekwencji z bazy danych Oracle. Przykład odwołuje się do sekwencji w zapytaniu INSERT INTO używanym do przesyłania nowych wierszy, a następnie zwraca wartość sekwencji wygenerowaną przy użyciu klauzuli RETURNING wprowadzonej w programie Oracle10g. W tym przykładzie dodano serię oczekujących nowych wierszy w obiekcie DataTable przy użyciu funkcji automatycznego zwiększania platformy ADO.NET w celu wygenerowania wartości klucza podstawowego "symbol zastępczy". Należy pamiętać, że wartość przyrostowa ADO.NET wygenerowana dla nowego wiersza jest tylko "symbolem zastępczym". Oznacza to, że baza danych może wygenerować różne wartości od tych, które ADO.NET wygenerować.

Przed przesłaniem oczekujących wstawień do bazy danych przykład wyświetla zawartość wierszy. Następnie kod tworzy nowy OracleDataAdapter obiekt i ustawia jego InsertCommand i UpdateBatchSize właściwości. W przykładzie przedstawiono również logikę zwracającą wartości wygenerowane przez serwer przy użyciu parametrów wyjściowych. Następnie przykład wykonuje aktualizację w celu przesłania oczekujących wierszy i wyświetla zawartość elementu DataTable.

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();  
   }  
}  

Zobacz też