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

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

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

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

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3335閲覧

VBAでpreparedstatementを使用すると文字化けする

kajipec

総合スコア2

VBA

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

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/07/17 04:10

前提・実現したいこと

VBAからpreparedstatementを使用してMySQLにデータ登録

発生している問題・エラーメッセージ

登録情報に日本語を設定した際に文字化け(すべての文字が???)します。 英語や数字を設定した際は問題ないです。

該当のソースコード

VBA

1 2 Dim con As New ADODB.Connection 3 4'DB接続 5Function getConnection() 6 con.Open "Driver=MySQL ODBC 8.0 Unicode Driver; SERVER=127.0.0.1; DATABASE=aaa_db; USER=aaa; PASSWORD=aaa123;" 7End Function 8 9'preparedstatementを利用して登録 10Sub preparedInsert() 11 12 getConnection 13 14  Dim sql As String 15 sql = "INSERT INTO aaa_db (`NAME`, `TEL`, `ZIP`, `ADDRESS`, `CONTACT_NAME`, `CONTACT_EMAIL`, `CREATED`, `UPDATED`) VALUES (?,?,?,?,?,?,?,?)" 16 17 Dim cmd As ADODB.Command 18 Set cmd = New ADODB.Command 19 20 With cmd 21 .ActiveConnection = con 22 .CommandText = sql 23 .Parameters.Append cmd.CreateParameter("NAME", adChar, adParamInput, 100, "佐藤") 24 .Parameters.Append cmd.CreateParameter("TEL", adChar, adParamInput, 50, "090-2222-2222") 25 .Parameters.Append cmd.CreateParameter("ZIP", adChar, adParamInput, 50, "111-1111") 26 .Parameters.Append cmd.CreateParameter("ADDRESS", adChar, adParamInput, 100, "東京") 27 .Parameters.Append cmd.CreateParameter("CONTACT_NAME", adChar, adParamInput, 50, "鈴木") 28 .Parameters.Append cmd.CreateParameter("CONTACT_EMAIL", adChar, adParamInput, 50, "AAA@gmail.com") 29 .Parameters.Append cmd.CreateParameter("CREATED", adInteger, adParamInput, , 20200101) 30 .Parameters.Append cmd.CreateParameter("UPDATED", adInteger, adParamInput, , 20200101) 31 .Execute 32 End With 33 34 con.Close 35 36End Function 37 38 39'preparedstatementを利用しないで登録 40Sub insert() 41 42  getConnection 43 44 Dim sql As String 45 sql = "INSERT INTO " aaa_db " (`NAME`, `TEL`, `ZIP`, `ADDRESS`,`CONTACT_NAME`, `CONTACT_EMAIL`, `CREATED`, `UPDATED`) VALUES ('佐藤','090-2222-2222','111-1111','東京','鈴木','AAA@gmail.com',20200101,20200101)" 46 47 con.Execute(sql) 48 con.Close 49 50End Function

試したこと

3番目のプロシージャに記載したpreparedstatementを利用しない方法でSQL文を実行したところ、
文字化けすることなくデータは登録されました。
その為、preparedstatementでの処理に問題があるのと考えています。

補足情報(FW/ツールのバージョンなど)

Excel 64bit
Microsoft ActiveX Data Objects 6.1 Library

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

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

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

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

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

guest

回答1

0

ベストアンサー

odbcドライバーの設定に「character set」「initial statement」っていうのがあるらしいですので接続文字列に加えるとどうなりますか?

コメント欄から追記

とりあえずadWChar系にしてみては?「adVarWChar」と「adWChar」だったと思う。
.Parameters.Append cmd.CreateParameter("NAME", adWChar, adParamInput, 100, "佐藤")

https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/datatypeenum?view=sql-server-ver15

投稿2020/07/17 05:00

編集2020/07/20 00:16
sousuke

総合スコア3828

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

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

kajipec

2020/07/17 05:30

回答ありがとうございます。 下記の通りにやってみたのですが、うまくいきませんでした。 なにかおかしい部分あるでしょうか。 Driver=MySQL ODBC 8.0 Unicode Driver; SERVER=127.0.0.1; DATABASE=aaa_db; USER=aaa; PASSWORD=aaa123;CHARACTER SET SJIS; Initial Statement = SET NAMES sjis"
退会済みユーザー

退会済みユーザー

2020/07/17 05:42

Unicodeは日本語文字化けするのでは?
sousuke

2020/07/17 06:10

ぱぱっと調べたところ「ANSI DRIVERを使え」っていう人もいてなおさらわからん。 とりあえずadWChar系にしてみては?「adVarWChar」と「adWChar」だったと思う。 .Parameters.Append cmd.CreateParameter("NAME", adWChar, adParamInput, 100, "佐藤")
kajipec

2020/07/20 00:00

adVarWCharにしてみたところ文字化けせずにうまくいきました! ありがとうございます(⊙ꇴ⊙)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問