前提・実現したいこと
MySQL Community Serverに対して、Access 2016のVBAのDAOでMySQL ODBCドライバ を用いて接続するシステムを作っています。
これまで正常に動作していたシステムが2020年6月13日以降から突然動作しなくなりました。
原因・対処方法がわからず困っています。
VBAのDAO.RecordsetオブジェクトにMySQLのリンクテーブル経由でSQLを渡して操作する際に、
Accessが異常終了してしまいます。
同じAccess上からDAOではなく、直接リンクテーブルのCRUD操作は問題ありません。
このとき、イベントビューアでは以下のエラーメッセージが発生しています。
発生している問題・エラーメッセージ
障害が発生しているアプリケーション名: MSACCESS.EXE、バージョン: 16.0.12827.20336、タイム スタンプ: 0x5edad85e 障害が発生しているモジュール名: acedao.dll、バージョン: 16.0.12827.20152、タイム スタンプ: 0x5ebb99a4 例外コード: 0xc0000005 障害オフセット: 0x00030fb6 障害が発生しているプロセス ID: 0x15b4 障害が発生しているアプリケーションの開始時刻: 0x01d641ff09b59cc9 障害が発生しているアプリケーション パス: C:\Program Files (x86)\Microsoft Office\Root\Office16\MSACCESS.EXE 障害が発生しているモジュール パス: C:\Program Files (x86)\Microsoft Office\Root\Office16\acedao.dll レポート ID: 4cc1e040-adf2-11ea-9793-b88303f19af1 障害が発生しているパッケージの完全な名前: 障害が発生しているパッケージに関連するアプリケーション ID:
該当のソースコードの例(一部省略)
Visual
1Public Function getno() As String 2 Dim RS As DAO.Recordset 3 Set RS = CurrentDb.OpenRecordset("select SEQNUM from SYS_DENPYO_SEQ;") 4 5 With RS 6 .Edit 7 !SEQNUM = !SEQNUM + 1 8 .Update 9 getno = Format(!SEQNUM, "0000") 10 End With 11 12 RS.Close 13 Set RS = Nothing 14End Function
試したこと
- MySQLの最新版(8.0.13→8.0.20)へのバージョンアップ
- Office更新オプションを使ってAccessを最新化
- MySQL ODBCドライバの削除・再インストール
- 別のクライアント(Windows 10 2004)のAccess 2016から
同じODBCドライバにてサーバへ接続する場合でも、クライアント側のAccessがおちます。
- 開発機(Windows 10 2004 64bit)に新規にMySQL・Access等一式を構築しても同様でした。
- 新規にAccess Databaseを作成し、オブジェクトのインポート・リンクテーブルの作成をしても同様でした。
補足情報(FW/ツールのバージョンなど)
サーバ側
- OS:Microsoft Windows Server 2016 64bit バージョン1607 (OSビルド 14393.2639)
- MySQL Community Server 8.0.20(Windows X64)
クライアント側
- OS:Microsoft Windows 10 64bit 2004 (OSビルド 19041.329)
- Microsoft Access 2016 32ビット
- MySQL ODBCドライバ 8.0.20(Windows X86)
追加情報
・上記コードの何行目でエラー落ちるのか
→以下の行をコメントアウトするとおちません。
VBAのイミディエイトウィンドウから、行をコメントアウトしながら、関数を実行しました。
落ちる瞬間に「型が一致しません。」とエラーが表示されることもあります。
!SEQNUM = !SEQNUM + 1
・どのリンクテーブルでもDAOで開くと落ちるのか
→はい。他のリンクテーブルでも同様の現象が起きます。
・WindowsUpdateを6/13日前後で実行しているのか
→いいえ。履歴を見ましたがありませんでした。
・SYS_DENPYO_SEQの定義(create table文)
→以下の通りです。
sql
1CREATE TABLE SYS_DENPYO_SEQ( 2 SEQNUM DECIMAL(4,0) NOT NULL DEFAULT 0, 3 INS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 4 UPD TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 5);
- イミディエイトウィンドウで操作していると、以下のようなメモリの参照が誤っているような、異常な挙動が確認できました。
!SEQNUM = !SEQNUM + 1
をコメントアウトgetno = Format(!SEQNUM, "0000")
の行にブレークポイントを設定- イミディエイトウィンドウで
?getno()
を実行し、ブレークポイントで中断する。 RS.Fields("SEQNUM")
で変数の内容を出力する都度、内容が変わる。
文字列型ではないのに文字列や文字化けした内容が返ってくる。
?RS.Fields("SEQNUM") ツール ?RS.Fields("SEQNUM") ?RS.Fields("SEQNUM") ??潮 ?RS.Fields("SEQNUM") ??????????
再現用情報
-
再現用.accdb をつくりました。
-
ODBCドライバの設定は以下の手順です。参考URL
- 32bit版ODBCデータソースアドミニストレータを開く。
%windir%\SysWOW64\odbcad32.exe
システムDSN
を追加MySQL ODBC 8.0 ANSI Driver
を選択- MySQLサーバの
IP:port,User/Password,database
を入力してtest
ボタンで接続が通ることを確認 Connection
タブのAllow big result sets
にチェックConnection
タブのCharacter Set
をcp932
Metadata
タブのTreat BIGINT columns as INT columns
にチェックCursors/Results
タブのReturn matched rows instead of affected rows
にチェックOK
ボタンで保存
- 32bit版ODBCデータソースアドミニストレータを開く。
回答1件
あなたの回答
tips
プレビュー