4

私は本当に私を悩ませている VBA の非対話型の問題と戦っています: ユーザーがダブルクリックするとうまく動作する mysql データベースへのパススルー クエリがあります。ただし、対話が最初に行われなかった場合、VBA オートメーション セッション (Excel から呼び出される) から呼び出されると失敗します。最も奇妙なこと: GUI でしばらくクリックすると、VBA から動作します( odbc mysql 接続タイムアウトの可能性があります)。

パススルー クエリには、DSN と接続文字列にパスワードがあります (ストアの問題を整理するため)。動作は、リンク テーブルと同じです。

呼び出される問題のある VBA コードは次のようになります。

CurrentProject.Connection.Execute "INSERT INTO [SomeLocalTable] (id) SELECT id FROM [somePassThroughOrLinkedMySQLTable]"

エラーは、一般的な odbc 接続障害 80004005 です。

このタイプのクエリは常に機能しますが、次のようになります。

Dim cnn As New ADODB.Connection
cnn.Open ("Driver=MySQL ODBC 5.2w Driver;SERVER=myserver;UID=user;DATABASE={db};PORT=3306;DFLT_BIGINT_BIND_STR=1;PWD=secret")

UI のようにパススルー クエリを「初期化」して機能させることはできますか? または、2 番目のタイプのクエリを使用して、ローカルの MS Access テーブルに挿入できますか?

環境: Win8-64bit、Office2013、mysql-odbc-5.2w

4

1 に答える 1

2

Accessデータベースを外部ADODBデータソースとして参照しているため、問題が発生していると思います。代わりに、DAOを介してクエリを実行するためにAccessのインスタンスを使用します。以下のサンプルサブは、Accessの非表示のインスタンスを作成してクエリを実行し、終了すると終了します。この例ではDAOバージョン3.6で遅延バインディングを使用したため、そのビットを少し修正するか、早期バインディングを使用する必要があります。

Sub ExecPassThru()

Dim acApp As Object
Dim acDb As Object

    Set acApp = CreateObject("Access.Application")
    Set acDb = CreateObject("DAO.DBEngine.36") 'May need slight alteration
    acApp.OpenCurrentDatabase ("C:\db1.mdb") 'Amend as required

    Set acDb = acApp.CurrentDb

    acDb.Execute "INSERT INTO [SomeLocalTable] (id) SELECT id FROM [somePassThroughOrLinkedMySQLTable]"

    acDb.Close
    acApp.Quit 2

End Sub

これはExcel2003を使用してコーディングされましたが、それ以降のバージョンのOfficeに変換するのに十分簡単なはずです。

于 2012-12-13T08:56:37.163 に答える