2016-05-25 10 views
0

をコミット私はオートナンバー値が前のTransactコミット取得に問題があります。私は2つのテーブルを持っています: "Table1"は、AutonumberとTable2の列を含んでいます。取得オートナンバー型の値は、前のTransact

これは私のコードです:

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 

私はtransaction.Commit()前に "IdTable1" を見つけるにはどうすればよいですか?

+2

に必要なものを同じように、私はジョエルのソリューションを実装することをお勧め([は、ExecuteScalar]を見てください知っているhttps://msdn.microsoft.com /en-us/library/system.data.sqlclient.sqlcommand.executescalar%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)。挿入した最初の行の最初の列(ID)を返します。私は答えを投稿う –

+0

私はyhis 1試す瞬間、 –

+2

:)非常にmutchそれはあなたの答えのメリットが投票してマークされ、私は必要なものだありがとう、私はジョエルの答えは、私は:) –

答えて

2

あなたは、データベースへの1回の旅行でこのすべてを行うことができます。あなたが返すようにExecuteScalarの代わりExecuteNonQueryを使用する最初のクエリのために

:私のコメントを1として

'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 
+0

[OK]を示唆したものよりもはるかに優れたソリューションとなります信仰を持って@ProGrammer –

+0

感謝が、それは –

2

:これは、簡単にID値を扱うだけでなく、取引の必要性を排除することができますあなたのクエリによって生成された自動ID。

ので、この行:

nbre = cmd.ExecuteNonQuery()

は次のようになります。

nbre = cmd.ExecuteScalar()

そして、あなたはnbreに保存されている返されたIDと?????を置き換えることができます。

注: 私はこの問題を解決したが、それはあなたが単一のクエリ

+0

おかげ@Proグラマー仕事@Joelsおかげで、あなたは正しいですが、ジョエルのsoutionは非常に私はあなたをVOT SIを最適化されています。 –

関連する問題