tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルMS-ACCESSのクエリ名やリンクテーブル名の取得は?
記事No6545
投稿日: 2007/11/12(Mon) 18:03
投稿者タツ
MS-ACCESSのMDBファイルに含まれるテーブルやクエリのフィールド名を
取得するアプリを作成しています。

GetOleDbSchemaTableを使用しテーブル名を取得することは出来ましたが、
クエリ名やリンクテーブル名を取得する方法が調べ切れていません。

参考になるサイト等ありましたら教えてください。
WindowsXP, Visual Studio 2003 を使っています。

[ツリー表示へ]
タイトルRe: MS-ACCESSのクエリ名やリンクテーブル名の取得は?
記事No6551
投稿日: 2007/11/13(Tue) 18:44
投稿者タツ
自己レスです。
ADODBとADOXを使用し、下記のようにして、
テーブル名とクエリ名を取得することが出来ました。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strPath As String
        strPath = "D:\test.mdb"
        Dim cn As New ADODB.Connection
        Dim cat As ADOX.Catalog
        Dim viw As ADOX.View
        Dim tbl As ADOX.Table
        Dim strmsg As String

        cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath
        cn.Open()

        cat = New ADOX.Catalog
        cat.ActiveConnection = cn

        With Me.ListBox1
            For Each viw In cat.Views
                .Items.Add(viw.Name)
            Next viw

            For Each tbl In cat.Tables
                If tbl.Type = "TABLE" Then
                    .Items.Add(tbl.Name)
                End If
            Next
        End With

        cat = Nothing
        cn.Close()
    End Sub

リンクテーブル名の取得は、まだ調査中です。

[ツリー表示へ]
タイトルRe^2: MS-ACCESSのクエリ名やリンクテーブル名の取得は?
記事No6553
投稿日: 2007/11/14(Wed) 02:21
投稿者魔界の仮面弁士
# 相手が mdb なら、DAO の方が細かい情報が得られるかな…。

> ADODBとADOXを使用し、下記のようにして、
> テーブル名とクエリ名を取得することが出来ました。
ADODB.Connection の OpenSchema メソッドを使う事もできますね。

> リンクテーブル名の取得は、まだ調査中です。
Propeties コレクションを列挙してみてください。

[ツリー表示へ]
タイトルRe^3: MS-ACCESSのクエリ名やリンクテーブル名の取得は?
記事No6554
投稿日: 2007/11/14(Wed) 14:54
投稿者タツ
> ADODB.Connection の OpenSchema メソッドを使う事もできますね。

下記のようにするのですね。
※下記リンクをほぼそのまま使用しましたが・・。
 http://www.microsoft.com/japan/msdn/columns/office/office10052000.aspx

        Dim strPath As String
        strPath = "D:\test.mdb"
        Dim cn As New ADODB.Connection
        Dim rstList As ADODB.Recordset
        cn = New ADODB.Connection

        With cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .Open(strPath)
        End With

        rstList = cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables)

        With Me.ListBox1
            Do While Not rstList.EOF
                If Not (rstList.Fields("TABLE_TYPE") Is "VIEW") Then
                    .Items.Add(rstList.Fields("TABLE_NAME"))
                End If
                rstList.MoveNext()
            Loop
        End With

        cn.Close()
        cn = Nothing

> Propeties コレクションを列挙してみてください。

Propertiesコレクション・・については、よく分からないままなので、
さらに調べてみます。

ひとまず、ADODBとADOXを使用したものの内、
下記部分に追加を行うことで(タイプの指定を追記した)、
リンクテーブルの名前も取得出来ました。

>             For Each tbl In cat.Tables
>                 If tbl.Type = "TABLE" Then
>                     .Items.Add(tbl.Name)
>                 End If
>             Next

            For Each tbl In cat.Tables
                If tbl.Type = "TABLE" Then
                    .Items.Add(tbl.Name)
                ElseIf tbl.Type = "LINK" Then
                    .Items.Add(tbl.Name)
                ElseIf tbl.Type = "PASS-THROUGH" Then
                    .Items.Add(tbl.Name)
                End If
            Next

> # 相手が mdb なら、DAO の方が細かい情報が得られるかな…。

DAOの方がMS-ACCESSに特化してるのですね。
DAOでの取得方法も調べておきたいと思います。

ありがとうございました。

[ツリー表示へ]
タイトルRe^4: MS-ACCESSのクエリ名やリンクテーブル名の取得は?
記事No6555
投稿日: 2007/11/14(Wed) 16:40
投稿者魔界の仮面弁士
> 下記のようにするのですね。

ADO や ADOX や DAO などの ActiveX コンポーネントを使う場合は、使用後に
「Marshal.ReleaseComObjec」メソッドによって、『解放』処理が必要だそうです。
http://support.microsoft.com/kb/321415/ja


特に .Fields 等へのアクセスは、階層化されている分、解放が面倒になりがちですので、
個人的には Recordset を直接読み取るのではなく、DataAdapter を使って、いったん、
ADO.NET のクラスである DataSet (あるいは DataTable) に変換される事をお薦めします。


  Dim tbl As New DataTable()

  Dim rs As ADODB.Recordset = cn.OpenSchema(ADODB.SchemaEnum.adSchemaColumns)
#If VBC_VER >= 8.0 Then
  Using d As New OleDb.OleDbDataAdapter()
    d.Fill(tbl, rs)
  End Using
#Else
  Dim d As New OleDb.OleDbDataAdapter()
  d.Fill(tbl, rs)
  d.Dispose()
#End If
  rs.Close()
  Runtime.InteropServices.Marshal.ReleaseComObject(rs)
  cn.Close()
  Runtime.InteropServices.Marshal.ReleaseComObject(cn)

  dataGrid1.SetDataBinding(tbl, Nothing)

[ツリー表示へ]
タイトルRe^4: MS-ACCESSのクエリ名やリンクテーブル名の取得は?
記事No6556
投稿日: 2007/11/14(Wed) 17:38
投稿者タツ
> DAOでの取得方法も調べておきたいと思います。

下記の方法で取得出来ました。

        Dim strPath As String
        strPath = "D:\test.mdb"
        Dim ws As dao.Workspace
        Dim dbe As New dao.DBEngine
        Dim db As dao.Database
        Dim tbl As dao.TableDef
        Dim qry As dao.QueryDef
        Dim strtbl, strqry As String

        ws = dbe.Workspaces(0)
        db = ws.OpenDatabase(strPath)

        With Me.ListBox1
            For Each tbl In db.TableDefs
                strtbl = tbl.Name
                If Not (Microsoft.VisualBasic.Left(strtbl, 2) Is "MS") Then
                    .Items.Add(strtbl)
                End If
            Next tbl
            For Each qry In db.QueryDefs
                strqry = qry.Name
                If Not (Microsoft.VisualBasic.Left(strqry, 2) Is "MS") Then
                    .Items.Add(strqry)
                End If
            Next qry
        End With

        db.Close()
        ws.Close()

ADODB、ADOXを使用する場合では、MDBファイルの容量が大きいと、
アクセスに時間がかかっていましたが、DAOで取得数量にしたところ、
アクセス時間が大幅に短縮されていました。

#こちらも、解放処理・・を考えないといけないのですね。

[ツリー表示へ]