none
既存mdbのテーブル情報の取得 RRS feed

  • 質問

  • VB2005です。

    既存mdbからテーブル定義を取得し、テーブル定義書を作成したいと

    思っています。

    以下の方法で列情報を取得する事は出来ました。
    ----------------------------------------------------------------------------------------------

    Dim oleCmd As New OleDbCommand

    Dim strData As String

    Using Cnn As New OleDbConnection
       Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Test\Test.mdb"

     Cnn.Open()

       oleCmd.Connection = Cnn
         oleCmd.CommandText = "SELECT * FROM tblTest"

     

       Dim oleReader As OleDbDataReader = oleCmd.ExecuteReader(CommandBehavior.KeyInfo)
         Dim dtTable As DataTable = oleReader.GetSchemaTable()

     

       For Each dtRow As DataRow In dtTable.Rows
             For Each dtColumn As DataColumn In dtTable.Columns
                 Select Case dtColumn.ColumnName
                     Case "ColumnName"  : strData = dtRow(dtColumn).ToString()
                     Case "ColumnSize"  : strData += "," & dtRow(dtColumn).ToString()
                     Case "DataType"    : strData += "," & dtRow(dtColumn).ToString()
                     Case "AllowDBNull" : strData += "," & dtRow(dtColumn).ToString()
                     Case "IsKey"       : strData += "," & dtRow(dtColumn).ToString()
                 End Select
             Next
         Next

    End Using
    ----------------------------------------------------------------------------------------------

    テーブル定義書の項目は以下の通りです。

    ・主キー

    ・項目名

    ・型

    ・サイズ

    ・Null

    ・空文字列

    ・インデックス

     

    主キーは「IsKey」

    項目名は「ColumnName」

    型は   「DataType」

    サイズは「ColumnSize」

    Nullは  「AllowDBNull」

    と解釈しましたが、正しいでしょうか?

    また「空文字列の許可」と「インデックス」はどこから取得すればよいでしょうか?

     

    ご存知の方がいらっしゃいましたら教えてください。

    宜しくお願い致します。

    2007年4月11日 2:12

回答

すべての返信

  •  マイマ さんからの引用
    Nullは  「AllowDBNull」

    AllowDBNull は、Null を許容するかどうかですよね。
    それと、MDB + OLEDB プロバイダの組み合わせでは、取得できない項目があったような。
    2007年4月11日 4:03
  • じゃんぬねっとさん、ありがとうございます。

     

     じゃんぬねっと さんからの引用

    AllowDBNull は、Null を許容するかどうかですよね。

    それと、MDB + OLEDB プロバイダの組み合わせでは、取得できない項目があったような。

     

    オートナンバー型のフィールドもちゃんと取得できないようです・・・。

    (AutoIncrement=Falseとなる)

    VB2005からmdbのテーブル定義書を作る事は諦めた方が良いでしょうか・・・?

    2007年4月11日 6:26
  • とりあえず、GetOleDbSchemaTableを使ってみたらどうなりますでしょうか?

     

    GetOleDbSchemaTable と Visual Basic .NET を使用してスキーマ情報を取得する方法
     http://support.microsoft.com/kb/309488/ja

    2007年4月11日 7:41
    モデレータ
  • trapemiyaさん、ありがとうございます。

     

     trapemiya さんからの引用

    とりあえず、GetOleDbSchemaTableを使ってみたらどうなりますでしょうか?

     

    GetOleDbSchemaTable と Visual Basic .NET を使用してスキーマ情報を取得する方法
     http://support.microsoft.com/kb/309488/ja

     

    GetOleDbSchemaTableで、

    schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})

    制約と黄色の部分を「Columns」や「Primary_Keys」に変更して

    ・主キー

    ・項目名

    ・データ型

    ・サイズ

    ・Null許容

    は取得できました。

    ただ、やはり「空文字列」「インデックス」「オートナンバー」はどこから取得すれば良いのかわかりませんでした・・・。

    2007年4月12日 6:38
  • ADO.NETでは無理のようです。ADOXを使ったサンプルコードが以下に載っています。この辺りを突破口にしてみて下さい。

     

    Detect autonumbered field in MS Access
     http://www.developmentnow.com/g/7_2004_1_0_0_128639/Detect-autonumbered-field-in-MS-Access.htm

    2007年4月13日 2:56
    モデレータ
  •  trapemiya さんからの引用

    ADO.NETでは無理のようです。ADOXを使ったサンプルコードが以下に載っています。この辺りを突破口にしてみて下さい。

     

    Detect autonumbered field in MS Access
     http://www.developmentnow.com/g/7_2004_1_0_0_128639/Detect-autonumbered-field-in-MS-Access.htm

     

    trapemiyaさん、ありがとうございます。

    ADOXで作成してみました。

    以下のコードで取得できました。

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

    --------------------------------------------------------------

    Dim adoCat As ADOX.Catalog = New ADOX.Catalog

    Dim Cnn As New ADODB.Connection

    Dim adoIndex As ADOX.Index

    Dim blnRes As Boolean

     

    Cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Test\Test.mdb"

    Cnn.Open()

     

    adoCat.ActiveConnection = Cnn

     

    Dim adoTable As ADOX.Table = adoCat.Tables("tblTest")

     

    For Each adoCol As ADOX.Column In adoTable.Columns
        If adoCol.Properties("AutoIncrement").Value = True Then
            Console.WriteLine("オートナンバー:True")
        End If

        For i As Integer = 0 To adoTable.Indexes.Count - 1
            adoIndex = adoTable.Indexes(i)

            For j As Integer = 0 To adoIndex.Columns.Count - 1
                If adoIndex.Columns(j).Name = adoCol.Name Then
                    If adoIndex.PrimaryKey = True Then
                        Console.WriteLine("PrimaryKey:True")
                    Else
                        blnRes = False
                        Select Case adoIndex.Unique
                            Case True : Console.WriteLine("Unique:True")
                            Case False : Console.WriteLine("Unique:False")
                        End Select
                    End If
                End If
            Next j
        Next i

      Console.WriteLine("項目名:" & adoCol.Name)
        Console.WriteLine("型:" & adoCol.Type)
        Console.WriteLine("サイズ:" & adoCol.DefinedSize)
        Console.WriteLine("Null:" & adoCol.Properties("Nullable").Value)
        Console.WriteLine("空文字列:" & adoCol.Properties("Jet OLEDB:Allow Zero Length").Value)
        Console.WriteLine("説明:" & adoCol.Properties("Description").Value)

    Next

    Console.ReadLine()

    --------------------------------------------------------------

    2007年4月18日 2:07