我在提交事务处理之前检索自动编号值时遇到问题。我有两张桌子:"表1和#34;其中包含一个包含Autonumber和Table2的列。
这是我的代码:
Dim req As String = "insert into Table1 values(@val1,@val2)"
Using cmd As SqlCommand = New SqlCommand(req, con)
cmd.Parameters.Add(New SqlParameter("@val1", MyVal1))
cmd.Parameters.Add(New SqlParameter("@val2", MyVal2))
cmd.Transaction = transaction
nbre = cmd.ExecuteNonQuery()
End Using
req = "insert into Table2 values(@IdTable1, @Val)"
Using cmd As SqlCommand = New SqlCommand(req, con)
cmd.Parameters.Add(New SqlParameter("@IdTable1", ?????))
cmd.Parameters.Add(New SqlParameter("@Val",MyVal))
cmd.Transaction = transaction
cmd.ExecuteNonQuery()
End Using
transaction.Commit()
con.Close()
Return nbre
如何找到" IdTable1"在transaction.Commit()
之前?
答案 0 :(得分:2)
您可以在一次数据库中完成所有这些操作。这样可以更轻松地处理ID值,并且无需事务处理:
'Need VS2015 for the multiline string literal. Otherwise use concatenation
Dim req As String = "
INSERT INTO Table1 VALUES (@val1,@val2);
SELECT @IdTable1 = scope_identity();
INSERT INTO Table2 VALUES (@IdTable1, @Val);"
Using con As New SqlConnection("connection string here"), _
cmd As New SqlCommand(req, con)
'Guessing at parameter types here... it's often better to be explicit about this
cmd.Parameters.Add("@val1", SqlDbtype.VarChar, 50).Value = MyVal1
cmd.Parameters.Add("@val2", SqlDbType.NVarChar, 200).Value = MyVal2
cmd.Parameters.Add("@Val", SqlDbType.Int).Value = MyVal
cmd.Parameters.Add("@IdTable1", SqlDbType.Int)
cmd.Parameters("@IdTable1").Direction = ParameterDirection.Output
con.Open()
cmd.ExecuteNonQuery()
Return CInt(cmd.Parameters("@IdTable1").Value)
End Using
答案 1 :(得分:2)
根据我的评论:
对于您要使用ExecuteScalar
而不是ExecuteNonQuery
的第一个查询,要返回您的查询生成的自动ID。
所以这一行:
nbre = cmd.ExecuteNonQuery()
变为:
nbre = cmd.ExecuteScalar()
然后,您可以将?????
替换为nbre
中存储的返回ID。
注意: 我知道这已经解决了这个问题,但我建议实施Joel的解决方案,因为它可以在单个查询中完成您的需求