Accessでオートナンバー型のKeyを、INSERT後に取得したいのですが、その方法を教えてください。初心者のため、初歩的質問で申し訳ないですがよろしくお願いいたします。



1.テーブル TBL001
  ID オートナンバー レプリケーションID KEY設定
  NAME テキスト型

2.UPDATE例
※下記のようなコードで、Rsに割り当てられたIDを入れたいです(実際にはこのコードではRs代入時にエラーになります)
  '変数
  Dim strSQLStatement As String
  Dim Cn As ADODB.Connection
  Dim Rs As ADODB.Recordset
  'DB登録
  strSQLStatement = "INSERT INTO TBL001 (NAME) VALUES ('山田太郎')"
  Set Cn = CurrentProject.Connection
  Set Rs = Cn.Execute(strSQLStatement)
  Rs.Close: Set Rs = Nothing
  Cn.Close: Set Cn = Nothing

私の環境です
  MS Acsess 2003 SP1
  Windows XP SP2

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/04/23 13:51:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:mj99 No.2

回答回数138ベストアンサー獲得回数38

ポイント35pt

こうゆうことですかね。

Sub hoge()
    
    Dim cn As ADODB.Connection
    Dim rs As New ADODB.Recordset
    
    Set cn = CurrentProject.Connection
    rs.Open "SELECT * FROM TBL001", cn, adOpenDynamic, adLockPessimistic
    
    rs.AddNew ' レコード追加
    
    Debug.Print StringFromGUID(rs("ID").Value) ' 設定されたIDをプリント
    
    rs("NAME").Value = "山田太郎"
    
    rs.Update ' レコードの変更を確定
    
    rs.Close
    
End Sub

id:zfmx

ご回答ありがとうございました。

このような方法があるとは知りませんでした。

2008/04/17 21:37:02

その他の回答2件)

id:ki2neko No.1

回答回数11ベストアンサー獲得回数0

ポイント23pt

select * from TBL001 where name = '山田太郎'

更新時の日時分秒を入力する'insertDateTime'等、適当にテーブルにカラムを新設して

insert時に同時に更新するようにしてやり、検索時にあわせて検索すると間違いありません。

CSVなどから一斉にデータ入力があって日時分秒(およびマイクロ秒)まで固有にならない場合がありもっと徹底的にやりたい場合は、

'key'等、照合専用のカラムを作り、uniqueをtrueにした上で適当に乱数生成したりして埋めるといいと思います。

id:zfmx

ご回答ありがとうございました

2008/04/17 21:36:59
id:mj99 No.2

回答回数138ベストアンサー獲得回数38ここでベストアンサー

ポイント35pt

こうゆうことですかね。

Sub hoge()
    
    Dim cn As ADODB.Connection
    Dim rs As New ADODB.Recordset
    
    Set cn = CurrentProject.Connection
    rs.Open "SELECT * FROM TBL001", cn, adOpenDynamic, adLockPessimistic
    
    rs.AddNew ' レコード追加
    
    Debug.Print StringFromGUID(rs("ID").Value) ' 設定されたIDをプリント
    
    rs("NAME").Value = "山田太郎"
    
    rs.Update ' レコードの変更を確定
    
    rs.Close
    
End Sub

id:zfmx

ご回答ありがとうございました。

このような方法があるとは知りませんでした。

2008/04/17 21:37:02
id:freemann No.3

回答回数335ベストアンサー獲得回数55

ポイント22pt

以下のようなコードでできると思います。

ここでIDは新しいほうが大きくなっていくのであとから挿入したものの方が大きいはずなので、同じ名前の人がいても、MAX関数で取得すれば今挿入したもののIDが取得できます。

(注意)

こちらはAccess2007で検証しました。フィールド名にNAMEを設定するとエラーがでますので、便宜上aNAMEとしています。

テキスト0:登録したい名前を入れるテキストボックス

ラベル6:登録した名前のIDを表示するためのラベル

Private Sub コマンド7_Click()

Dim strSQL As String

Dim Conn As ADODB.Connection

Dim Rs As New ADODB.Recordset

strSQL = "INSERT INTO TBL001(aNAME) VALUES('" & Me.テキスト0.Value & "')"

Set Conn = CurrentProject.Connection

Conn.Execute (strSQL)

strSQL = "SELECT MAX(ID) AS xID FROM TBL001 WHERE aNAME = """ & Me.テキスト0.Value & """ GROUP BY aNAME"

Rs.Open strSQL, Conn, adOpenStatic

If Rs.RecordCount = 0 Then

MsgBox "レコードが登録されていません"

Exit Sub

End If

Me.ラベル6.Caption = Rs![xID].Value

End Sub

id:zfmx

ご回答ありがとうございました。

2008/04/17 21:37:05

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません