在提交交易

时间:2016-05-25 14:37:38

标签: vb.net transactions

我在提交事务处理之前检索自动编号值时遇到问题。我有两张桌子:"表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()之前?

2 个答案:

答案 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的解决方案,因为它可以在单个查询中完成您的需求