よくある問題ですが、ほとんどのソリューションは複数のSQLコマンドを連結することを指していますが、ADO/VBAではできないと思います(ただし、この点で間違って表示されることになります)。Excel VBAを使って新しく挿入されたレコードのIDを取得する方法は?
私は現在、私の新しいレコードを挿入し、新しく挿入されたレコードだけが返されることを保証するのに十分なフィールドを使って選択クエリを実行します。私のデータベースは一度に複数の人によってアクセスされることはほとんどありません(クエリ間で別の挿入が起こるリスクはほとんどありません)。テーブルの構造上、新しいレコードを特定することは通常非常に簡単です。
私は現在、擬似プライマリキー以外の一意性のスコープがあまりないテーブルを更新しようとしています。これは、新しいレコードがユニークではないというリスクがあることを意味し、一意性を強制するフィールドを追加するのは嫌です。
レコードをAccessテーブルに挿入し、この状況でExcelから新しいプライマリキーをクエリする最も良い方法は何ですか?
返信いただきありがとうございます。私は@@IDENTITY
を動作させようとしましたが、これは以下のコードを使用して常に0を返します。
Private Sub getIdentityTest()
Dim myRecordset As New ADODB.Recordset
Dim SQL As String, SQL2 As String
SQL = "INSERT INTO tblTasks (discipline,task,owner,unit,minutes) VALUES (""testDisc3-3"",""testTask"",""testOwner"",""testUnit"",1);"
SQL2 = "SELECT @@identity AS NewID FROM tblTasks;"
If databaseConnection Is Nothing Then
createDBConnection
End If
With databaseConnection
.Open dbConnectionString
.Execute (SQL)
.Close
End With
myRecordset.Open SQL2, dbConnectionString, adOpenStatic, adLockReadOnly
Debug.Print myRecordset.Fields("NewID")
myRecordset.Close
Set myRecordset = Nothing
End Sub
何か目立つものはありますか?
しかし、Renaud(下記)が提供してくれた注意点を踏まえて、@@IDENTITY
を他の方法と同じように使用すると危険性が高いようですので、今はSELECT MAX
を使用しています。私は上記の私の試みに何が間違っているか見ることに興味があるが、将来の参照のために。
Max'は注意が必要です '使い方:実際には、あなたもテーブルを指定する必要はありません。唯一レコードを挿入している場合は、進んでください。 –