プロが教えるわが家の防犯対策術!

お世話になります。

VBAでMySQLに接続をし、DB操作をするものを作成しています。

・Windows7
・エクセル2007
・MySQL 5.1
・ODBC

そこで、以下のことをしたいと思っています。
(1)ある特定のデータベースの中にあるテーブル名を全取得
(2)そのテーブル名を変数または配列に格納
(3)そのテーブル名をキーに、今度はフィールド名を全取得

私が組んでみた該当のソースの部分は、
  Dim aaa As New ADODB.Recordset

  strSql = "show tables from testdb;"
  Set aaa = con.Execute(strSql) 'conはADODB.connection

Dim j As Integer

For j = 1 To aaa.Fields.Count
MsgBox aaa.Fields(j -1).name
Next

・・・とここまで来ました。
show tables from databaseで、データベースにあるテーブルを取得して、
aaa.Fields(j -1).nameには「Tables_in_testdb」が入ります。
その次に、もう消してしまったので無いのですが、
msgbox aaa.Fields("Tables_in_testdb")?とやってみたところ、
データベースに入っている一つのテーブル名だけしか取得できませんでした。

ソースが回りくどい気がする+テーブル名が取得出来ず、
大分煮詰まっています。。。

何かもっとうまい書き方や構文(サンプル)ありましたら教えてください!!!

A 回答 (3件)

XL2000のコードですけれど、ご参考まで。


SELECT * とかでテーブルからレコードセットを取得して、Fields(i).nameを取得してみたけれど、
重たそうなので更に調べてみると、ADOでもDESCRIBEが使える様です。
(DESCでも良いけれど、降順と紛らわしいので)
ADOの参照設定要です。
Sub test()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim strSQL As String

'XAMPPのMYSQLのデータベースにODBC接続してみた
cn.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};DATABASE=*****;" _
& "PWD=******;PORT=3306;SERVER=localhost;" _
& "STMT=SET NAMES utf8;UID=******"
cn.Open
strSQL = "SHOW TABLES;"
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
Do Until rs.EOF
Debug.Print rs.Fields(0)
strSQL = "DESCRIBE " & rs.Fields(0) & ";"
rs2.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
Do Until rs2.EOF
'最後に余分な,がつくのは手抜きです
Debug.Print rs2.Fields(0) & ",";
rs2.MoveNext
Loop
Debug.Print
rs2.Close
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set rs2 = Nothing
cn.Close
Set cn = Nothing
End Sub

参考URL:http://support.microsoft.com/kb/193332/ja
    • good
    • 0

私も Oracle と SQLServer しかやってないけど、



> Do Until aaa.EOF
>   MsgBox aaa.Fields(0).Value
> LOOP

ADODB.Recordset は
MoveNext で明示的なカレントレコードの移動が必要な気がする。
(もう、.NET 環境しかないので ADODB の資料は手元に無いわ)
    • good
    • 0

MySQL はわからないのですが、パッと見て気になったところを。


aaa には SHOW TABLES FROM testdb の結果が Recordset として格納されてるんですよね。
ならテーブルの数だけレコード数がありますよね。
なのにそのあとでループしてるのはレコードではなくて、1件目のレコードの列をループしてますよね。

Do Until aaa.EOF
MsgBox aaa.Fields(0).Value
LOOP

とかじゃないの?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています