Sekvence Oracle
Rozhraní .NET Framework Zprostředkovatel dat pro Oracle poskytuje podporu pro načtení hodnot vygenerovaných serverem sekvencí Oracle po vložení pomocí OracleDataAdapter.
SQL Server a Oracle podporují vytváření automaticky inkrementačních sloupců, které lze označit jako primární klíče. Tyto hodnoty jsou generovány serverem při přidání řádků do tabulky. V SYSTÉMU SQL Server nastavíte vlastnost Identity sloupce; v Oracle vytvoříte sekvenci. Rozdíl mezi sloupci automatického přírůstku v SQL Serveru a posloupnostmi v Oracle spočívá v tom, že:
- V SQL Serveru označíte sloupec jako sloupec automatického přírůstku a SQL Server automaticky vygeneruje nové hodnoty pro sloupec při vložení nového řádku.
- V Oracle vytvoříte sekvenci, která vygeneruje nové hodnoty pro sloupec v tabulce, ale mezi sekvencí a tabulkou nebo sloupcem neexistuje přímé propojení. Posloupnost Oracle je objekt, jako je tabulka nebo uložená procedura.
Když vytvoříte sekvenci v databázi Oracle, můžete definovat její počáteční hodnotu a přírůstek mezi jeho hodnotami. Před odesláním nových řádků můžete také zadat dotaz na sekvenci nových hodnot. To znamená, že váš kód dokáže rozpoznat klíčové hodnoty pro nové řádky předtím, než je vložíte do databáze.
Další informace o vytváření sloupců automatického přírůstku pomocí SQL Serveru a ADO.NET naleznete v tématu Načítání hodnot identit nebo automatického číslování a vytváření sloupců automatického přírůstku.
Příklad
Následující příklad jazyka C# ukazuje, jak můžete načíst nové hodnoty sekvence z databáze Oracle. Příklad odkazuje na sekvenci v INSERT INTO
dotazu použitém k odeslání nových řádků a pak vrátí hodnotu sekvence vygenerovanou pomocí RETURNING
klauzule představené v Oracle10g. Příklad přidá řadu čekajících nových řádků v DataTable ADO. Funkce automatického přírůstku net pro generování "zástupných" hodnot primárního klíče Všimněte si, že hodnota přírůstku ADO.NET vygenerovaná pro nový řádek je jen zástupný symbol. To znamená, že databáze může generovat jiné hodnoty než ty, které ADO.NET generuje.
Před odesláním čekajících vložení do databáze se v příkladu zobrazí obsah řádků. Pak kód vytvoří nový OracleDataAdapter objekt a nastaví jeho InsertCommand a UpdateBatchSize vlastnosti. Příklad také poskytuje logiku pro vrácení hodnot generovaných serverem pomocí výstupních parametrů. Pak příklad spustí aktualizaci, která odešle čekající řádky a zobrazí obsah DataTablesouboru .
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();
}
}