Oracle 序列
用于 Oracle 的 .NET Framework 数据提供程序支持在使用 OracleDataAdapter 执行插入后检索服务器生成的 Oracle 序列键值。
SQL Server 和 Oracle 支持创建可指派为主键的自动递增列。 在向表中添加行时,服务器会生成这些值。 在 SQL Server 中,您可以设置列的标识属性;在 Oracle 中,您可以创建一个序列。 SQL Server 中自动递增列和 Oracle 中序列的区别是:
- 在 SQL Server 中,将某列标记为自动递增列,SQL Server 会在您插入新行时为该列自动生成新值。
- 在 Oracle 中,您创建一个序列以便为表中的列生成新值,但序列和表或列之间不存在直接链接。 Oracle 序列是一个类似表或存储过程的对象。
在 Oracle 数据库中创建序列时,您可以定义其初始值以及值之间的增量。 在提交新行之前,您也可以查询序列中的新值。 这意味着在你将新行插入数据库之前,代码可识别新行的键值。
若要详细了解如何通过使用 SQL Server 和 ADO.NET 来创建自动递增列,请参阅检索标识或自动编号值和创建自动增量列。
示例
下面的 C# 示例演示如何从 Oracle 数据库检索新序列值。 此示例引用用于提交新行的 INSERT INTO
查询中的序列,然后返回使用 Oracle10g 中引入的 RETURNING
子句生成的序列值。 此示例可使用 ADO.NET 自动递增功能在 DataTable 中添加一系列挂起的新行,以生成“占位符”主键值。 注意:ADO.NET 为新行生成的增量值仅是一个“占位符”。 这意味着数据库生成的值可能与 ADO.NET 生成的值不同。
在将挂起的插入行提交给数据库之前,此示例显示行的内容。 然后,代码将创建一个新的 OracleDataAdapter 对象并设置其 InsertCommand 和 UpdateBatchSize 属性。 此示例还提供使用输出参数返回服务器生成的值的逻辑。 然后,此示例将执行更新以提交挂起的行并显示 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();
}
}