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