Access2007のVBAでADOでMySQL8.0.20にODBC接続、ADOのRecordsetのUpdateメソッドで下記エラーが発生することがあります。
実行時エラー '-2147217864 (80040e38)':
行が見つからなかったため、更新できません。列の値は最後に読み込まれた後で変更された可能性があります。
VBAソースコード
1 2 Const adUseClient As Integer = 3 3 Const adOpenStatic As Integer = 3 4 Const adLockOptimistic As Integer = 3 5 6 Dim cn As Object 7 Set cn = CreateObject("ADODB.Connection") 8 cn.ConnectionString = "DSN=社員台帳管理用;" 9 cn.CursorLocation = adUseClient 10 cn.Open 11 12 Dim sql As String 13 sql = "SELECT * FROM 社員取得資格 WHERE 社員No = '" & Me!社員No & "' AND 資格No = '0001' ;" 14 15 Dim rs As Object 16 Set rs = CreateObject("ADODB.Recordset") 17 rs.Open sql, cn, adOpenStatic, adLockOptimistic 18 19 With rs 20 .Fields("運転免許証_種類").Value = Me!運転免許証_種類.Value '① 21 If Nz(Me!失効年.Value, "") <> "" And Nz(Me!失効月.Value, "") <> "" And Nz(Me!失効日.Value, "") <> "" Then 22 If IsDate(Me!失効年.Value & "年" & Me!失効月.Value & "月" & Me!失効日.Value & "日") = True Then 23 .Fields("失効年月日").Value = Format(Me!失効年.Value & "年" & Me!失効月.Value & "月" & Me!失効日.Value & "日", "yyyy/mm/dd") '② 24 End If 25 End If 26 .Update 'ここでエラー 27 .Close 28 End With 29 30 cn.Close 31 Set rs = Nothing 32 Set cn = Nothing
####コードの説明
recordsetの元になるSQL文のFROM句のテーブル「社員取得資格」のキーはWHERE句の「社員No」と「資格No」です。
recordsetには、一件レコードが入っています。
「運転免許証_種類」フィールドに、「運転免許証_種類」テキストボックスの値を代入。
「失効年月日」フィールドに、「失効年」「失効月」「失効日」コンポボックスの値を日付の形に加工してIsDateがTrueなら代入。
Updateして、終了。
####状況
エラー内容のように、レコードが探せなくなるようなことはないように見え、どう直せばいいかわからずにいます。
試した限りで、エラーが起きる条件があるようでした。
Updateメソッドの前にフィールドに値を代入しているソースの①、②について、
元のフィールドの値と同じ値がFieldsのValueプロパティに代入されている時に、Updateメソッドが実行されるとエラーが発生します。
また、当然ですが②がIf文で実行されなく、①で元のフィールドの値と同じ値をValueプロパティに代入するパターンもエラーです。
①、②どちらか一方でも、元のフィールドの値と違う値が代入されていれば、エラーは起きず正常に終了します。
さらに、①、②をコメントアウトして、Recordsetを開いて即Updateを実行するようなコードを試してみるとエラーは発生しませんでした。
この現象についてご存じの方がいらっしゃれば、教えていただきたいです。
###補足
元々Accessのみ使用でDAOを使用しており、MySQLを使用するためにDAOをADOに変更しています。
ADOに変更する中で、このエラーが発生しました。
また、他に少し気になることがあり、
ADODB.ConnectionのCursorLocationと
Recordsetを開くときのCursorTypeとLockTypeについて
いずれも、コード中では数値でいうと3を指定していますが、3以外の定数を指定しても、Debug.Printで確認すると3が指定されています。
ADODBをCreateObjectではなく参照設定で事前バインディングして行うと、CursorLocationとLockTypeについては好きな値を指定できますが、CursorTypeは必ず3になってしまいます。
この3つの値が意図しない値になる現象に困っている人はネットでもちらほら見かけますが、解決した記事が見当たらなく、どうしてそうなるのかわかっていません。
本題と関係あるかわかりませんが、一応補足です。
######解決時オプション設定
解決しました。解決時のオプション設定を共有致します。
MyODBC8.0.20の「Return matching rows」に値するオプションは画像の「Return matched rows instead of affected rows」というオプションでした。
以前のバージョンを使用していないのでおそらくですが、バージョンの違いで少し違うということでしょうか。
共有させていただきます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/05 00:06
2020/06/05 00:53 編集
2020/06/05 00:57 編集
2020/06/05 01:02
2020/06/05 01:10
2020/06/05 01:10
2020/06/05 01:29
2020/06/05 01:35
2020/06/05 01:42
2020/06/05 02:15
2020/06/05 02:30
2020/06/05 02:39
2020/06/05 02:48
2020/06/05 02:49
2020/06/05 03:03 編集
2020/06/05 03:02
2020/06/05 03:10
2020/06/05 07:04
2020/06/05 07:18
2020/06/05 07:27
2020/06/05 07:29
2020/06/05 07:51 編集
2020/06/05 07:56
2020/06/05 08:11
2020/06/05 08:20
2020/06/09 00:15