
マイクロソフトデータベースアクセス(以下Access)は本当に意味が分からない事が多いです。
ココに注意
ちょっとしたことで数日間頭を悩ませるように事が良くあります。
今回も、簡単な更新するSQLをVBA内で動かそうとしたらエラーがでるのです。
簡単な更新SQLでハマる
クエリをSQLに変換して、VBA内に直接貼り付けてもエラーが起きることは普通です。
今回のエラーも、カンマやダブルコーテーションなどの違いからエラーが出ているという思い込みから時間が経過していきました。
フォームの値を、変数に変更して見たり、Dlookup関数を直接SQLに埋め込むような事はやめて変数にしてみたりと色々と工夫をしましたが、エラーから抜け出せません。
以下がエラーがでるコードです。
Sub input_login()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command
Dim SQL As String
Dim schno As String
Dim logu As String
On Error GoTo ErrRtn
schno = DLookup("auth_no", "dbo_login_user", "name='" & Me.user & "'")
logu = Forms![login]![user]
Set cn = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cn.BeginTrans
SQL = "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1"
cmd.CommandText = SQL
cmd.Execute
cn.CommitTrans
Set cmd = Nothing
cn.Close: Set cn = Nothing
ExitErrRtn:
Exit Sub
ErrRtn:
MsgBox "ログインし直してください。エラー: " & Err.description
cn.RollbackTrans
Set cmd = Nothing
cn.Close: Set cn = Nothing
End
End SubSQL = "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1"
上のSQLの部分でエラーが出ていると思い込んで様々な書き方を試してみましたがダメでした。
DoCmd.RunSQLにしたら問題なし
本当に簡単な更新SQLなのに3日間ほど悶々と時間が過ぎていきました。
そして、今日 DoCmd.RunSQL に行きつきました。
問題なく動いたコードが下記になります。
Sub input_login()
Dim cn As New ADODB.Connection
Dim SQL As String
Dim schno As String
Dim logu As String
On Error GoTo ErrRtn
schno = DLookup("auth_no", "dbo_login_user", "name='" & Me.user & "'")
logu = Forms![login]![user]
Set cn = CurrentProject.Connection
cn.BeginTrans
DoCmd.RunSQL "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1"
cn.CommitTrans
cn.Close: Set cn = Nothing
ExitErrRtn:
Exit Sub
ErrRtn:
MsgBox "ログインし直してください。エラー: " & Err.description
cn.RollbackTrans
cn.Close: Set cn = Nothing
End
End Sub
DoCmd.RunSQL "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1"
上のように、DoCmd.RunSQLを使ったら問題なくすんなりと動きました。
ココがダメ
この違いが自分には理解できません(´;ω;`)ウゥゥ
いつものやり方でダメならDoCmd.RunSQL
SQLをVBA内で動かす為には、定番のやり方しか頭にありませんでした。
【Access】クエリからSQLを生成してVBAで動かす為のコツ
今回のこの件で非常に無駄な時間を使ったので、定番のやり方でダメな場合は、DoCmd.RunSQLを使ってVBA内でのSQLは動かした方がよいという事がわかりました。
残念な事に、今の自分では、この定番とDoCmd.RunSQLを使ってのやり方は何が違うのかが理解して無いってことです。
いずれは、SqlServerだけで全ての処理ができるようになるかと思うので、この問題も深く突き詰めることは止めておきます。