获取自动增量主键

本节内容仅适用于SQL Server数据源。

通过执行Insert语句可以直接在后台增加行,如果需要后续处理,或者在多用户环境下,通知其他用户追载此行,那么我们就需要知道新增行的主键。

对于非自动增量的主键,因为我们增加行的时候,就已经确定了主键,所以不存在获取主键的问题。

对于自动增量型主键,主键值是由后台数据库自动生成的,需要采用特殊手段来获取。

我们可以在Insert语句之后合并一条Select语句:Select SCOPE_IDENTITY()

两条语句之间用分号隔开,例如:

例如:

Dim cmd As new SQLCommand
cmd
.ConnectionName = "Orders"
cmd
.CommandText = "Insert Into 订单 (客户, 日期, 数量) Values(?,?,?);Select SCOPE_IDENTITY()"
cmd
.Parameters.Add("@客户","联想")
cmd
.Parameters.Add("@日期",Date.Today)
cmd
.Parameters.Add("@数量",100)
Dim
id As Integer = cmd.ExecuteScalar()
Output
.Show("新增行主键:" & id)

一个综合示例

假定Orders(订单)表和OrderDetails(订单明细)表通过OrderID建立关联,且OrderID是自动增量。
如果现在希望新增一个订单以及对应的两个订单明细,由于OrderID是自动生成的,而且是在保存后生成,
我们必须想办法获取新增订单保存后的OrdersID,并赋值给对应的订单明细的OrdersID列,否则新增的订单(Order)及其对应的订单明细(OrderDetails)之间将会失去联系。

这个例子我们已经不止一次讲述过,用的都是SQLCommand的ExcuteReader方法,参考: SQLCommand中的示例七,SQLCommand与数据库事务中的示例五

下面我们不用ExcuteReader方法,纯用SQL语句完成,为确保数据完整性,这里用了数据库事务:

Dim cmd As new SQLCommand
cmd
.ConnectionName = "Orders"
Try

    cmd.BeginTransaction()
'
开启事务
 
   
'
增加订单
    cmd.CommandText = "Insert Into Orders (CustomerID, EmployeeID, OrderDate) Values(?,?,?);Select SCOPE_IDENTITY()"
    cmd.Parameters.Add("@CustomerID","EASTC")
    cmd.Parameters.Add("@EmployeeID",8)
    cmd.Parameters.Add("@OrderDate",Date.Today)
    Dim ID As Integer = cmd.ExecuteScalar()
'
新增订单,并获取自动生成的OrderID
   
   
'
增加第一个订单明细
    cmd.Parameters.Clear()
'
务必清除之前的参数,为下一次执行SQL语句做准备.
    cmd.CommandText = "Insert Into OrderDetails(OrderID, ProductID, UnitPrice,Quantity) Values(?,?,?,?)"
    cmd.Parameters.Add("@OrderID", ID )
    cmd.Parameters.Add("@ProductID", 49)
    cmd.Parameters.Add("@UnitPrice", 14.7)
    cmd.Parameters.Add("@Quantity" ,20)
    cmd.ExecuteNonQuery()
   
   
'
增加第二个订单明细
    cmd.Parameters.Clear()
'
务必清除之前的参数,为下一次执行SQL语句做准备.
    cmd.CommandText = "Insert Into OrderDetails(OrderID, ProductID, UnitPrice,Quantity) Values(?,?,?,?)"
    cmd.Parameters.Add("@OrderID", ID )
    cmd.Parameters.Add("@ProductID", 75)
    cmd.Parameters.Add("@UnitPrice", 36.8)
    cmd.Parameters.Add("@Quantity" ,40)
    cmd.ExecuteNonQuery()
   
    cmd.Commit()
'
提交事务
Catch
ex As Exception '如果出错
    cmd.Rollback()
'
则回滚事务
   
MessageBox.Show(ex.Message, "错误",MessageBoxButtons.OK,MessageBoxIcon.Error)
End
Try

 


本页地址:http://www.foxtable.com/webhelp/topics/3274.htm