• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセスDbのテーブル項目属性の取得(VB2005))

アクセスDbのテーブル項目属性を取得できない理由

このQ&Aのポイント
  • 質問者は、VB2005でアクセスデータベースのテーブル項目属性を取得しようとしていますが、どうしても「桁数」と「タイプ」を取得することができません。
  • 問題の場所は、質問者が試しているプロパティですが、DAOでは「.size」と「.type」を使用していました。
  • 現在の質問者のコードでは、テーブル名とフィールド名を取得することはできているようですが、プロパティの情報が欠落しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • ape5
  • ベストアンサー率57% (85/148)
回答No.2

なんとかできました。 ポイントは、 {Nothing,Nothing,Nothing,"Table"} → {Nothing,Nothing,"テーブル名",Nothing} のところです。 ただ、データタイプが数値で表示されていて、何を表してるのかはわからないのでまだ研究部分は残しておきました(ていうか、わからなかった。) プログラムの後半部分は、カラム情報で欲しいところだろうと思うところを確認するのに便利なようにしてあるつもりです。 また、何かありましたら、レスください。 ------------------------------------------------ Dim strMDB As String strMDB = "F:\はてな\在庫管理1.mdb" Dim St As String Dim UserID As String = "Admin" Dim Password As String = "" Dim MDBFile As String = strMDB Dim Cn As New System.Data.OleDb.OleDbConnection() St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Dim tbl As DataTable = New DataTable() Dim objRestrictions As Object objRestrictions = New Object() {Nothing, Nothing, "欲しいテーブルの名前", Nothing} Dim strData As String Dim myRows() As DataRow Cn.ConnectionString = St Cn.Open() tbl = Cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, objRestrictions) Cn.Close() myRows = tbl.Select() strData = tbl.Columns.Item(3).ColumnName.ToString() strData = tbl.Columns.Item(11).ColumnName.ToString() strData = tbl.Columns.Item(13).ColumnName.ToString() strData = tbl.Columns.Item(15).ColumnName.ToString() If Not IsDBNull(myRows(0).ItemArray(3)) Then strData = myRows(0).ItemArray(3) End If If Not IsDBNull(myRows(0).ItemArray(11)) Then strData = myRows(0).ItemArray(11) End If If Not IsDBNull(myRows(0).ItemArray(13)) Then strData = myRows(0).ItemArray(13) End If If Not IsDBNull(myRows(0).ItemArray(15)) Then strData = myRows(0).ItemArray(15) End If ---------------------------------------------------------

noname#24731
質問者

お礼

大変お手数をかけたようで申しわけありません。理由などがあまり理解できずにコーディングをCOPYさせていただいたりして、目的の項目が取得できました。 まず、テーブル名の取得でDataTbleを作成 Dim tbl0 As DataTable = New DataTable() Dim meRows() As DataRow tbl0 = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) meRows = tbl0.Select() これで小生の必要な項目が '名前 meRows(tabel番号).ItemArray(2)) '種類 meRows(tabel番号).ItemArray(3)) '更新日 作成 meRows(tabel番号).ItemArray(8 9)) であることがわかりました。 この後 ご教示いただいたコーディング Dim tbl As DataTable = New DataTable() Dim objRestrictions As Object objRestrictions = New Object() {Nothing, Nothing, meRows(0).ItemArray(2), Nothing} Dim strData As String Dim myRows() As DataRow tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Columns, objRestrictions) Cn.Close() myRows = tbl.Select() これで取得できました 尚 データタイプは小生のアクセスデータからVB5の時のタイプか類推し小生が使用しているタイプもわかってきました tbl.Columns.Item(2).ColumnName.ToString) '"TABLE_NAME" tbl.Columns.Item(3).ColumnName.ToString) '"COLUMN_NAME" tbl.Columns.Item(6).ColumnName.ToString) '"ORDINAL_POSITION" tbl.Columns.Item(11).ColumnName.ToString() '"DATA_TYPE" '2 Integer '3 Long '4 Single '7 日付 '130 文字 と Memo         Memoの時次の(13)HARACTER_MAXIMUM_LENGTHが 0 tbl.Columns.Item(13).ColumnName.ToString) '"MAXIMUM_LENGTH" tbl.Columns.Item(15).ColumnName.ToString() 'これは不要でした ありがとうございました。

その他の回答 (1)

  • ape5
  • ベストアンサー率57% (85/148)
回答No.1

DataSetでは無くて,DataTableで見れるようです。 以下を参考にしてみてください ------------------------------------- Dim strMDB As String Dim St As String Dim Cn As New System.Data.OleDb.OleDbConnection() Dim SQL As System.Data.OleDb.OleDbCommand Dim UserID As String = "Admin" Dim Password As String = "" Dim MDBFile As String = strMDB strMDB = "XXXXXX.mdb" St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Dim tbl As DataTable = New DataTable() Dim oleDbAdapter1 As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter() Dim strData As String Cn.ConnectionString = St SQL = New OleDb.OleDbCommand("SELECT * FROM TableName", Cn) oleDbAdapter1.SelectCommand = SQL oleDbAdapter1.Fill(tbl) 'strDataにデータタイプが取れます strData = tbl.Columns(3).DataType.ToString() ------------------------------------------- 何か問題がありましたらレスください。

noname#24731
質問者

補足

回答ありがとうございます。 ご指示のとおり、コーディングしたつもりですが Dim oleDbAdapter1 As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter() なども = New などもその通りに修正(変数名はDaなどですが) For Each row As DataRow In myRows Dim cmd As New OleDb.OleDbCommand("SELECT * From " +row.ItemArray(2), Cn) Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter() da.SelectCommand = New OleDb.OleDbCommand("SELECT * From " + row.ItemArray(2), Cn) 'da.Fill(ds, row.ItemArray(2)) da.Fill(tbl) For I = 0 To dr.FieldCount - 1 S = dr.GetName(I) 'Field name   'S = ds.Tables(0).Columns(I).ColumnName S = tbl.Columns(I).ColumnName S = tbl.Columns(I).DataType.ToString() Next Next S = tbl.Columns(I).DataType.ToString()でとれる値は "sysytem.string"(integerの場合でも)です Iを(3)でも同じです。 また Fieldの設計桁数(特に string の時)も取得したいのですが。 よろしくお願いいたします。