获取自动增量主键
本节内容仅适用于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