Oracle-sekvenser
.NET Framework-dataprovidern för Oracle har stöd för att hämta de servergenererade oraclesekvensvärdena efter att ha utfört infogningar med hjälp OracleDataAdapterav .
SQL Server och Oracle stöder skapandet av automatiskt inkrementella kolumner som kan betecknas som primära nycklar. Dessa värden genereras av servern när rader läggs till i en tabell. I SQL Server anger du identitetsegenskapen för en kolumn. i Oracle skapar du en sekvens. Skillnaden mellan kolumner med automatisk inkrement i SQL Server och sekvenser i Oracle är att:
- I SQL Server markerar du en kolumn som en automatisk inkrementell kolumn och SQL Server genererar automatiskt nya värden för kolumnen när du infogar en ny rad.
- I Oracle skapar du en sekvens för att generera nya värden för en kolumn i tabellen, men det finns ingen direkt länk mellan sekvensen och tabellen eller kolumnen. En Oracle-sekvens är ett objekt, till exempel en tabell eller en lagrad procedur.
När du skapar en sekvens i en Oracle-databas kan du definiera dess initiala värde och öka mellan dess värden. Du kan också fråga sekvensen efter nya värden innan du skickar nya rader. Det innebär att koden kan identifiera nyckelvärdena för nya rader innan du infogar dem i databasen.
Mer information om hur du skapar automatiskt inkrementella kolumner med hjälp av SQL Server och ADO.NET finns i Hämta identitets- eller räknarevärden och Skapa autoinkrementskolumner.
Exempel
I följande C#-exempel visas hur du kan hämta nya sekvensvärden från Oracle-databasen. Exemplet refererar till sekvensen i frågan INSERT INTO
som används för att skicka de nya raderna och returnerar sedan sekvensvärdet som genereras med hjälp av RETURNING
satsen som introducerades i Oracle10g. Exemplet lägger till en serie väntande nya rader i en DataTable med hjälp av ADO. NET:s funktioner för automatisk inkrement för att generera primärnyckelvärden för platshållare. Observera att inkrementsvärdet ADO.NET genererat för den nya raden bara är en "platshållare". Det innebär att databasen kan generera andra värden än de som ADO.NET genererar.
Innan du skickar väntande infogningar till databasen visas innehållet i raderna i exemplet. Sedan skapar koden ett nytt OracleDataAdapter objekt och anger dess InsertCommand och UpdateBatchSize egenskaperna. Exemplet tillhandahåller också logiken för att returnera de servergenererade värdena med hjälp av utdataparametrar. Sedan kör exemplet uppdateringen för att skicka de väntande raderna och visar innehållet i DataTable.
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();
}
}