Oracle-sorozatok

Az Oracle .NET-keretrendszer adatszolgáltatója támogatja a szerver által generált Oracle Sequence kulcsértékek lekérését a OracleDataAdapter használatával történő beszúrások után.

Az SQL Server és az Oracle támogatja az elsődleges kulcsként kijelölhető automatikusan növekvő oszlopok létrehozását. Ezeket az értékeket a kiszolgáló hozza létre, amikor sorokat ad hozzá egy táblához. Az SQL Serverben egy oszlop Identitás tulajdonságát állítja be; az Oracle-ben létrehoz egy sorozatot. Az SQL Server automatikus növekményes oszlopai és az Oracle-sorozatok közötti különbség a következő:

  • Az SQL Serverben automatikus növekményes oszlopként jelöl meg egy oszlopot, az SQL Server pedig automatikusan új értékeket hoz létre az oszlophoz új sor beszúrásakor.
  • Az Oracle-ben létrehoz egy sorozatot, amely új értékeket hoz létre a táblázat egy oszlopához, de nincs közvetlen kapcsolat a sorrend és a tábla vagy oszlop között. Az Oracle-sorozat egy objektum, például egy tábla vagy egy tárolt eljárás.

Amikor egy Oracle-adatbázisban létrehoz egy sorozatot, meghatározhatja annak kezdeti értékét és az értékek közötti növekményt. Az új sorok elküldése előtt lekérdezheti az új értékek sorrendjét is. Ez azt jelenti, hogy a kód képes felismerni az új sorok kulcsértékeit, mielőtt beszúrja őket az adatbázisba.

További információ az automatikus növekményes oszlopok SQL Server és ADO.NET használatával történő létrehozásáról: Identitás vagy számértékek lekérése és Automatikus beírási oszlopok létrehozása.

Példa

Az alábbi C#-példa bemutatja, hogyan kérhető le új szekvenciaérték az Oracle-adatbázisból. A példa az új sorok elküldéséhez használt lekérdezésben szereplő INSERT INTO sorrendre hivatkozik, majd visszaadja az Oracle10g-ben bevezetett záradékkal RETURNING létrehozott szekvenciaértéket. A példa egy sorozat függőben lévő új sort ad hozzá egy DataTable az ADO.NET automatikus növekményes funkciójának használatával, hogy "helyőrző" elsődleges kulcsértékeket generáljon. Vegye figyelembe, hogy az ADO.NET által generált új sorhoz tartozó növekményes érték csak egy "helyőrző". Ez azt jelenti, hogy az adatbázis különböző értékeket generálhat a ADO.NET által generált értékektől.

Mielőtt elküldené a függőben lévő beszúrásokat az adatbázisba, a példa megjeleníti a sorok tartalmát. Ezután a kód létrehoz egy új OracleDataAdapter objektumot, és beállítja annak InsertCommand és tulajdonságainak UpdateBatchSize tulajdonságait. A példa a kiszolgáló által létrehozott értékek kimeneti paraméterekkel történő visszaadására szolgáló logikát is tartalmazza. Ezután a példa végrehajtja a frissítést a függőben lévő sorok elküldéséhez, és megjeleníti a DataTablefájl tartalmát.

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

Lásd még