9

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

@@IDENTITY と MAX(column) を試しましたが、@@IDENTITY はゼロを返し、MAX はあまり信頼できません (データの挿入が遅い場合があるため、挿入される前に 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 つの関数で行われるため、上記のコードはわかりにくいかもしれませんが、これは 2 つの関数から取ったものです。2 つのステートメントが実行されますが、例として実行されるステートメントを 1 つだけ示しました。

@@IDENTITY と MAX に代わるものはありますか? @@IDENTITY でどのように問題が発生するのかわかりません。

アドバイスをありがとう:)。

4

2 に答える 2

10

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

アップデート

望ましい別のアプローチは、2 つのステートメントを 1 つのステートメントで実行することです。

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

再度更新

MS Access データベースに対して、このような複数の関数を実行することはできないようです。1 回の操作で複数の SQL ステートメントを実行しています

于 2010-12-13T01:28:07.783 に答える
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
于 2016-11-19T19:33:00.607 に答える