2010-12-13 22 views
6

私はAccessデータベースでVB.NETを使用していますが、値を挿入しますが、最後に挿入されたID(自動番号)を取得して関連テーブルに挿入する必要があります。vb.net sqlが最後に挿入したID

@@ IDENTITYとMAX(列)を試しましたが、@@ IDENTITYはゼロを返し、MAXはあまり信頼できません(時にはデータを挿入するのが遅いので、挿入されたIDの前にIDを取得します)。上記のコードは混乱に見えるかもしれませんので

Dim insertSql = datalayer.getDataTable((String.Format("INSERT INTO users (username) VALUES ({0})", username))) 

Dim newID = datalayer.getDataTable((String.Format("SELECT @@IDENTITY FROM users"))) 


Dim con As OleDbConnection = getConnection() 
con.Open() 
Dim sqlCommand As OleDbCommand = New OleDbCommand(String.Format(insertSql), con) 
sqlCommand.ExecuteNonQuery() 

これは、2つの機能で行われますが、thatsのは、ちょうど2つの機能から取られました。 2つのステートメントが実行されますが、例として実行されたステートメントが表示されています。

@@ IDENTITYでどうやって問題が起こっているかわからないので、@ IDENTITYとMAXの代替方法がありますか?

アドバイスありがとうございました:)。

+0

アクセスは1つのコマンドで複数のステートメントをサポートしていないについては、私の最後の編集を参照してください。それが実際に働いていることを確認できますか、別のアプローチのために行ったことがありますか? –

答えて

6

これはSELECT @@ IDENTITYよりも絶対に重要です。挿入は、挿入と同じ接続(およびトランザクション)で実行されます。 getDataTable()メソッドが呼び出しごとに新しい接続を作成する場合、その理由は機能しません。

更新

望ましい別のアプローチは、再び

あなたのような複数の機能を実行できないように思える1

sql = "INSERT INTO...;SELECT @@IDENTITY..." 
Dim id = sqlCommand.ExecuteScalar(sql) 

アップデートで二つの文を実行することですこれは、MS Accessデータベースに対して、Running multiple SQL statements in the one operationです。

+0

こんにちは、はい、それは新しい接続を作成しません。私がちょうどデータベースへのフォームロード時に1つの接続を作成した場合、それは挿入、更新などにも有効でしょうか?ありがとう – Elliott

+0

+1 'ExecuteScalar'メソッドを提供するために、2つのSQL文をラップします。それは、私は決してそれを考えなかったでしょう。 =) –

+0

ありがとうございました。 – Elliott

0

次のコードをそのまま使用できます。 私はあなたがSqlDataSourceコントロールを使用して、イベントがあることを前提としています

Protected Sub SqlDataSource1_Inserted(sender As Object, e As SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Inserted 
Dim query As String = "SELECT @@IDENTITY" 
Dim cmd As New OleDbCommand(query, CType(e.Command.Connection, OleDbConnection)) 
Dim newid As Integer = cmd.ExecuteScalar() 
l1.Text = newid 
End Sub 
関連する問題