Megosztás a következőn keresztül:


Oracle-sorozatok

Az Oracle .NET-keretrendszer adatszolgáltatója támogatja a kiszolgáló által generált fő Oracle Sequence-értékek lekérését a beszúrások a használatával OracleDataAdaptertörténő végrehajtása 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 a függőben lévő új sorok sorozatát adja hozzá egy DataTable ADO használatával. A NET automatikus növekményes funkciója a "helyőrző" elsődleges kulcsértékek létrehozásához. Vegye figyelembe, hogy az új sorhoz ADO.NET 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