Bagikan melalui


Urutan Oracle

Penyedia Data .NET Framework untuk Oracle memberikan dukungan untuk mendapatkan nilai Urutan Oracle kunci yang dihasilkan server setelah melakukan penyisipan dengan menggunakan OracleDataAdapter.

SQL Server dan Oracle mendukung pembuatan kolom tambahan otomatis yang dapat ditetapkan sebagai kunci utama. Nilai-nilai ini dihasilkan oleh server saat baris ditambahkan ke tabel. Pada SQL Server, Anda mengatur properti Identitas kolom; pada Oracle Anda membuat sebuah Urutan. Perbedaan antara kolom auto-increment dalam SQL Server dan urutan di Oracle adalah bahwa:

  • Di SQL Server, Anda menandai kolom sebagai kolom auto-increment dan SQL Server secara otomatis menghasilkan nilai baru untuk kolom saat Anda menyisipkan baris baru.
  • Di Oracle, Anda membuat urutan guna menghasilkan nilai baru untuk kolom di tabel Anda, tetapi tidak ada hubungan langsung antara urutan dengan tabel atau kolom. Urutan Oracle adalah objek, seperti tabel atau prosedur yang disimpan.

Ketika Anda membuat urutan dalam database Oracle, Anda dapat menentukan nilai awal dan kenaikan antara nilai-nilainya. Anda juga dapat meminta urutan untuk nilai baru sebelum mengirimkan baris baru. Itu berarti kode Anda dapat mengenali nilai kunci untuk baris baru sebelum Anda memasukkannya ke dalam database.

Untuk informasi selengkapnya tentang pembuatan kolom tambahan otomatis dengan menggunakan SQL Server dan ADO.NET, lihat Memperoleh Identitas atau Nilai Autonumber dan Membuat Kolom AutoIncrement.

Contoh

Contoh C# berikut menunjukkan bagaimana Anda dapat memperoleh nilai urutan baru dari database Oracle. Contoh mereferensikan urutan dalam kueri yang INSERT INTO digunakan untuk mengirimkan baris baru, lalu mengembalikan nilai urutan yang dihasilkan menggunakan klausul yang RETURNING diperkenalkan di Oracle10g. Contoh menambahkan serangkaian baris baru yang tertunda dalam menggunakan DataTable ADO. Fungsionalitas kenaikan otomatis NET untuk menghasilkan nilai kunci utama "tempat penampung". Perhatikan nilai tambahan ADO.NET yang dihasilkan untuk baris baru hanyalah "tempat penampung". Itu berarti database mungkin menghasilkan nilai yang berbeda dari yang dihasilkan ADO.NET.

Sebelum memasukkan sisipan yang tertunda ke database, contoh menampilkan isi baris. Kemudian, kode membuat objek OracleDataAdapterbaru dan mengaturnya InsertCommand serta UpdateBatchSize propertinya. Contoh ini juga menyediakan logika untuk mengembalikan nilai yang dihasilkan server menggunakan parameter keluaran. Kemudian, contoh menjalankan pembaruan untuk memasukkan baris tertunda kemudian menampilkan isinyaDataTable.

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

Lihat juga