Delen via


Oracle-reeksen

De .NET Framework-gegevensprovider voor Oracle biedt ondersteuning voor het ophalen van de door de server gegenereerde sleutelreekswaarden na het uitvoeren van invoegingen met behulp van de OracleDataAdapter.

SQL Server en Oracle ondersteunen het maken van automatisch incrementele kolommen die kunnen worden aangewezen als primaire sleutels. Deze waarden worden door de server gegenereerd wanneer rijen worden toegevoegd aan een tabel. In SQL Server stelt u de eigenschap Identiteit van een kolom in; in Oracle maakt u een reeks. Het verschil tussen kolommen voor automatisch verhogen in SQL Server en reeksen in Oracle is dat:

  • In SQL Server markeert u een kolom als een kolom met automatische verhoging en genereert SQL Server automatisch nieuwe waarden voor de kolom wanneer u een nieuwe rij invoegt.
  • In Oracle maakt u een reeks voor het genereren van nieuwe waarden voor een kolom in uw tabel, maar er is geen directe koppeling tussen de reeks en de tabel of kolom. Een Oracle-reeks is een object, zoals een tabel of een opgeslagen procedure.

Wanneer u een reeks in een Oracle-database maakt, kunt u de oorspronkelijke waarde en de toename tussen de waarden definiëren. U kunt ook een query uitvoeren op de reeks voor nieuwe waarden voordat u nieuwe rijen verzendt. Dat betekent dat uw code de sleutelwaarden voor nieuwe rijen kan herkennen voordat u ze in de database invoegt.

Zie Voor meer informatie over het maken van kolommen voor automatisch verhogen met behulp van SQL Server en ADO.NET het ophalen van identiteiten of autonummeringswaarden en het maken van auto-aanmaakkolommen.

Opmerking

In het volgende C#-voorbeeld ziet u hoe u nieuwe reekswaarden kunt ophalen uit de Oracle-database. Het voorbeeld verwijst naar de reeks in de INSERT INTO query die wordt gebruikt om de nieuwe rijen in te dienen en retourneert vervolgens de reekswaarde die is gegenereerd met behulp van de RETURNING component die is geïntroduceerd in Oracle10g. In het voorbeeld wordt een reeks in behandeling zijnde nieuwe rijen in een DataTable toegevoegd met behulp van ADO. De functie voor automatisch verhogen van NET voor het genereren van primaire sleutelwaarden voor tijdelijke aanduidingen. Houd er rekening mee dat de incrementele waarde die ADO.NET gegenereerd voor de nieuwe rij slechts een tijdelijke aanduiding is. Dat betekent dat de database verschillende waarden kan genereren van de waarden die ADO.NET genereert.

Voordat u de in behandeling zijnde invoegingen naar de database verzendt, wordt in het voorbeeld de inhoud van de rijen weergegeven. Vervolgens wordt met de code een nieuw OracleDataAdapter object gemaakt en worden de eigenschappen en eigenschappen UpdateBatchSize ervan ingesteldInsertCommand. In het voorbeeld wordt ook de logica geleverd om de door de server gegenereerde waarden te retourneren met behulp van uitvoerparameters. Vervolgens wordt in het voorbeeld de update uitgevoerd om de rijen in behandeling te verzenden en wordt de inhoud van het DataTablebestand weergegeven.

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

Zie ook