質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

1回答

3731閲覧

Access2016とMySQL Server 8.0のVBA DAO接続で、MSACCESS.EXEのacedao.dllが異常終了する。

binone

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

0クリップ

投稿2020/06/14 04:48

編集2020/06/14 12:44

前提・実現したいこと

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);
  • イミディエイトウィンドウで操作していると、以下のようなメモリの参照が誤っているような、異常な挙動が確認できました。
  1. !SEQNUM = !SEQNUM + 1 をコメントアウト
  2. getno = Format(!SEQNUM, "0000") の行にブレークポイントを設定
  3. イミディエイトウィンドウで ?getno() を実行し、ブレークポイントで中断する。
  4. RS.Fields("SEQNUM") で変数の内容を出力する都度、内容が変わる。

文字列型ではないのに文字列や文字化けした内容が返ってくる。

?RS.Fields("SEQNUM") ツール ?RS.Fields("SEQNUM")  ?RS.Fields("SEQNUM") ??潮 ?RS.Fields("SEQNUM") ??????????

再現用情報

  • 再現用.accdb をつくりました。

  • ODBCドライバの設定は以下の手順です。参考URL

    1. 32bit版ODBCデータソースアドミニストレータを開く。%windir%\SysWOW64\odbcad32.exe
    2. システムDSN を追加
    3. MySQL ODBC 8.0 ANSI Driver を選択
    4. MySQLサーバのIP:port,User/Password,database を入力してtestボタンで接続が通ることを確認
    5. ConnectionタブのAllow big result setsにチェック
    6. ConnectionタブのCharacter Setcp932
    7. MetadataタブのTreat BIGINT columns as INT columnsにチェック
    8. Cursors/ResultsタブのReturn matched rows instead of affected rowsにチェック
    9. OKボタンで保存

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sousuke

2020/06/14 08:12

問題を解決してほしいなら以下のことは情報としてほしいです。 ・上記コードの何行目でエラー落ちるのか ・どのリンクテーブルでもDAOで開くと落ちるのか ・WindowsUpdateを6/13日前後で実行しているのか ・SYS_DENPYO_SEQの定義(create table文)
binone

2020/06/14 10:15

ありがとうございます。上記を追記しました。
binone

2020/06/14 10:46

再現用にAccessファイルを新規作成しました。
sousuke

2020/06/14 13:00 編集

私がぱっと見怪しいと思っていたのはdecimal型ですがint型(とかあるんですかね?)にする とどうなりますか?ODBCはデータ型の変換が怪しいので変な型を使うと挙動不審になるイメージです。 https://www.mc-maniacs.com/wp-blog/notes-mysql_with_ms-access-163/ あとシステムの復元で6/13以前にすると動作するようになるのかも気になる所さんです。
binone

2020/06/14 13:21

sousuke様 まさにご指摘の通りで、MySQLのdecimal型(=Accessの数値型の十進型)ではなくint型(=Accessの数値型の長整数型)にすることで改善されました。 これまでできていたのに、突然できなくなった原因はいまだにわかりませんが、DecimalをIntかDoubleに全部置き換えれば回避できそうです。 解決済みにしたいので回答をいただけますか?
guest

回答1

0

ベストアンサー

ODBCはデータ型が怪しいのでint型使いましょう。
あとmysqlにあるのかわかりませんがbit型のnull許容もアウトだった気がします。

あと最近のteratailの投稿でdecimal型がバグっているという質問もありましたよ。
https://teratail.com/questions/268974

投稿2020/06/14 13:30

編集2020/06/14 13:31
sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

binone

2020/06/14 13:32

ありがとうございます!迅速なご回答、大変助かりました!
sousuke

2020/06/14 13:37

あと多分ですがofficeのアップデートは自動でかかるようになっています。WindowsUpdateはかからなくてもOfficeは独立して自動更新しますからね、設定をいじらなければ。 2017年にoffice2013の自動更新で「vbaに日本語のfunctionやsubがある場合にエラー表示され『vbaプロジェクトを削除する』というエラーメッセージがでる」っていうヤバイ更新もあったので、私は止めてます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問