Sequenze OracleOracle Sequences

Il provider di dati .NET Framework per Oracle fornisce supporto per il recupero dei valori chiave delle sequenze di Oracle generati dal server dopo l'esecuzione di inserimenti tramite OracleDataAdapter.The .NET Framework Data Provider for Oracle provides support for retrieving the server-generated key Oracle Sequence values after performing inserts by using the OracleDataAdapter.

In SQL Server e Oracle è supportata la creazione di colonne a incremento automatico che è possibile impostare come chiavi primarie.SQL Server and Oracle support the creation of automatically incrementing columns that can be designated as primary keys. Tali valori vengono generati dal server quando si aggiungono righe a una tabella.These values are generated by the server as rows are added to a table. In SQL Server viene impostata la proprietà Identity di una colonna, mentre in Oracle viene creata una sequenza.In SQL Server, you set the Identity property of a column; in Oracle you create a Sequence. Di seguito è illustrata la differenza tra colonne a incremento automatico di SQL Server e sequenze di Oracle:The difference between auto-increment columns in SQL Server and sequences in Oracle is that:

  • In SQL Server, per una colonna contrassegnata come colonna a incremento automatico vengono automaticamente generati nuovi valori quando si inserisce una nuova riga.In SQL Server, you mark a column as an auto-increment column and SQL Server automatically generates new values for the column when you insert a new row.

  • In Oracle, per generare nuovi valori per una colonna di una tabella viene creata una sequenza, ma non esiste alcun collegamento diretto tra la sequenza e la tabella o la colonna.In Oracle, you create a sequence to generate new values for a column in your table, but there is no direct link between the sequence and the table or column. Una sequenza di Oracle è un oggetto, analogamente a una tabella o a una stored procedure.An Oracle sequence is an object, like a table or a stored procedure.

Quando si crea una sequenza in un database Oracle, è possibile definirne il valore iniziale e l'incremento tra i valori.When you create a sequence in an Oracle database, you can define its initial value and the increment between its values. È anche possibile eseguire una query sulla sequenza per rilevare nuovi valori prima di inviare nuove righe.You can also query the sequence for new values before submitting new rows. Il codice è quindi in grado di riconoscere i valori chiave per le nuove righe prima che vengano inserite nel database.That means your code can recognize the key values for new rows before you insert them into the database.

Per ulteriori informazioni sulla creazione di colonne a incremento automatico tramite SQL Server e ADO.NET, vedere il recupero dei valori di identità o contatore e la creazione di colonne AutoIncrement.For more information about creating auto-increment columns by using SQL Server and ADO.NET, see Retrieving Identity or Autonumber Values and Creating AutoIncrement Columns.

EsempioExample

Nell'esempio in C# seguente viene illustrato come recuperare nuovi valori di sequenza da un database Oracle.The following C# example demonstrates how you can retrieve new sequence values from Oracle database. Alla sequenza viene fatto riferimento nella query INSERT INTO usata per inviare le nuove righe e viene quindi restituito il valore di sequenza generato tramite la clausola RETURNING introdotta in Oracle10g.The example references the sequence in the INSERT INTO query used to submit the new rows, and then returns the sequence value generated using the RETURNING clause introduced in Oracle10g. Viene aggiunta una serie di nuove righe in sospeso in DataTable usando la funzionalità di incremento automatico di ADO.NET per generare valori di chiave primaria "segnaposto".The example adds a series of pending new rows in a DataTable by using ADO.NET’s auto-increment functionality to generate "placeholder" primary key values. Si noti che il valore dell'incremento generato per la nuova riga è soltanto un "segnaposto".Note that the increment value ADO.NET generated for the new row is just a "placeholder". Il database potrebbe quindi generare valori diversi da quelli generati da ADO.NET.That means the database might generate different values from the ones ADO.NET generates.

Prima dell'invio degli inserimenti in sospeso nel database, in questo esempio viene visualizzato il contenuto delle righe.Before submitting the pending inserts to the database, the example displays the contents of the rows. Quindi, nel codice viene creato un nuovo oggetto OracleDataAdapter e vengono impostate le relative proprietà InsertCommand e UpdateBatchSize.Then, the code creates a new OracleDataAdapter object and sets its InsertCommand and the UpdateBatchSize properties. Nell'esempio viene anche specificata la logica per restituire i valori generati dal server tramite parametri di output.The example also supplies the logic to return the server-generated values by using output parameters. Viene quindi eseguito l'aggiornamento per inviare le righe in sospeso e viene visualizzato il contenuto di DataTable.Then, the example executes the update to submit the pending rows and displays the contents of the 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();  
   }  
}  

Vedere ancheSee Also

Oracle e ADO.NETOracle and ADO.NET
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center