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

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

アクセスDbのテーブル項目属性の取得(VB2005)

ご協力いただき、table名 field名までは取得できたのですが、種々プロパティを試していますが、fieldの「桁数」「タイプ」がどうしても取得できません。DAoでは .size .type だったのですが。 この部分接続など略(800文字とのことなので) Cn.Open() Dim S As String Dim tbl As DataTable Dim myRows() As DataRow tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) Dim I As Short myRows = tbl.Select() 'S = myRows(1).ItemArray(2) Dim ds As New DataSet For Each row As DataRow In myRows 'MsgBox(row.ItemArray(2)) Dim cmd As New OleDb.OleDbCommand("SELECT * From " + row.ItemArray(2), Cn) Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader Dim da As New OleDb.OleDbDataAdapter("SELECT * From " + row.ItemArray(2), Cn) da.Fill(ds, row.ItemArray(2)) For I = 0 To dr.FieldCount - 1 S = dr.GetName(I) 'Field name S = ds.Tables(0).Columns(I).ColumnName          この2行は同じものがとれます。 tables columns gettypeなど どれもうまく取得できませんでした。 よろしくご教示ください。

noname#24731
noname#24731

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

  • ベストアンサー
  • 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 の時)も取得したいのですが。 よろしくお願いいたします。

関連するQ&A

  • アクセスDbのテーブル名の取得(VB2005)

    再度の質問です アクセスDBのテーブル名を取得したのですが、方法をご教示ください。DAOでは tabledefsでとれたのですが・・ 以下のコードで先に進めません。 OpenFileDialog1.Filter = "アクセス ファイル (*.mdb)|*.mdb" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then 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 = OpenFileDialog1.FileName Dim N As String = Microsoft.VisualBasic.Right(MDBFile, 9) St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Cn.ConnectionString = St SQL = Cn.CreateCommand Cn.Open() Dim tbl As DataTable tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) ここでtblを見ると TABLE_CATALOG _SCHEMA _NAME _TYPE ・・・DATE_MODIFIED などは見えるのですが、これがDB内のテーブル数だけ繰り返されます。 取得したいのは、TABLE_NAME に ある 例えば "Pub-ID"に相当する内容なのですが、HELPで探しても、その方法がわかりません、ぜひ教えてください。よろしくお願いいたします。

  • VB2008でMDBのオ-トナンバの項目をキ-にして読み込めなくて困っています

    VB2008とADO.NETを勉強中の超初心者です。 MDBのオ-トナンバの項目をキ-にして、読み込みたいと思って以下のようなプログラムを作ってみました。 Dim yobidashikey As Int32 = 1 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\KEYCHECK.mdb" Dim da As OleDbDataAdapter 'da = New OleDbDataAdapter("SELECT * FROM data WHERE key1 = 2", cn) da = New OleDbDataAdapter("SELECT * FROM data WHERE key1 = '" & yobidashikey & "'", cn) Dim ds As New DataSet da.Fill(ds, "data") DataGridView1.DataSource = ds.Tables("data") コメントアウトしてある直接「2」を指定した時は、デ-タグリッドビュ-にオ-トナンバが2の行が表示できました。 次に、yobidashikeyにオ-トナンバの値を入れて動作させると、da.Fill(ds, "data")で「抽出条件でデータ型が一致しません。」のエラ-が出てしまいました。 ちなみに、Dim yobidashikey As Int32 としたのは、DRead.GetFieldType(i).ToString()でオ-トナンバの項目がInt32と 表示されたので、この型にしました。 実際にオ-トナンバをキイ-にして読み込むシステムを作りたいので、是非教えて頂きたいと思います。 よろしくお願いします。

  • 【VB】データグリッドに読み込んだテーブルの変更を元のデータベースに反映させたい

    VB歴6ヶ月です。 VBのバージョンは2005です。 mdbから読み込んだデータベースをデータグリッドビューコントロールで表示しました。 CNには接続パスが入っていてmdbとの接続は確立しています。 データグリッドビューコントロールのオブジェクト名はDGVです。 読み込むテーブル名はt社員マスターです。 Private sub メンテナンス() Dim DS As DataSet = New DataSet("社員マスター") Dim SQL As String = "SELECT * FROM t社員マスター" Dim DA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(SQL, CN) DA.Fill(DS, "社員マスター") Dim DV As DataView = New DataView(DS.Tables("社員マスター")) DGV.DataSource = DV End sub これでグリッドに読み込ますことはできたのですが、 読み込んだデータをグリッド上で変更したら元のデータベースにも反映したいのですが やり方がわかりません >< 具体的なコード、やり方を教えていただけたらありがたいです。

  • デ-タテ-ブルの内容での更新の書き方が分らず困っています

    VB2008とADO.NETを勉強中の初心者です。 以下のようなプログラムで、デ-タテ-ブルの内容を変更後(このプログラムでは削除のみですが、追加の処理もやりたいと思っています)"SYOYOURYOU"を更新して、再度読み込みたいと思っています。 いろいろ、参考書等を見たのですが旨く処理できません。 *DBを再読み込みのために更新* の部分での記述の方法を教えて頂けないでしょうか。 よろしくお願いします。 '*LLCの初期化 Dim LLC As Integer = 0 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\MAPICS\MAPICS-S.mdb" Dim da As OleDbDataAdapter 'DataAdapterの作成 '*LLCを 0 から 10 まで処理 For LLC = 0 To 10 '所要量抽出 'DataAdapterの作成 da = New OleDbDataAdapter("SELECT * FROM SYOYOURYOU WHERE Syo_LLC =" & Str(LLC), cn) 'データを取得 Dim ds As New DataSet da.Fill(ds, "SYOYOURYOU") If ds.Tables("SYOYOURYOU").Rows.Count > 0 Then 'DataGridViewに表示 DataGridView1.DataSource = ds.Tables("SYOYOURYOU") MsgBox("確認1") For i = 0 To ds.Tables("SYOYOURYOU").Rows.Count - 1 'SYOYOURYOUをもとに処理を行う(この部分は省略) '処理済みのSYOYOURYOUのデ-タを削除 Dim dr As DataRow dr = ds.Tables("SYOYOURYOU").Rows(i) dr.Delete() 'DataGridViewに表示 DataGridView1.DataSource = ds.Tables("SYOYOURYOU") MsgBox("確認1") Next '***************************** 'DBを再読み込みのために更新 '***************************** End If Next '終了処理 End

  • VB2005でACCESSのADO.NETでのテーブル名取得

    VB2005 ACCESSのテーブル名を取得したいのですが、方法をご教示ください。以下のところで悩んでいます。 OpenFileDialog1.Filter = "アクセス ファイル (*.mdb)|*.mdb" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName <> "" Then 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 = OpenFileDialog1.FileName Dim N As String = Microsoft.VisualBasic.Right(MDBFile, 9) St = "Provider=""Microsoft.Jet.OLEDB.4.0"";" St &= "Data Source=""" & MDBFile & """;" St &= "User ID=" & UserID & ";" St &= "Jet OLEDB:Database Password=" & Password Cn.ConnectionString = St SQL = Cn.CreateCommand    Cn.Open() この後テーブル名までたどり着けません DataTable  Cn.GetSchema Cn.GetOleDbSchemaTable( "restrictions") などヘルプなどから試みていますが、これらのコーディング法がわかりません。 テーブル名がわかっている(サンプルのPubs の "Publisher")場合はデータセットからはフィールド名が取得できたのですが・・・ よろしくお願いいたします。

  • VB6.0とaccessのDBを接続する

    初めまして。 件名のようなことを実行する際、 以下のソースを参考にしようと思ったのですが、 ******************************************* Dim cn As New ADODB.Connection Dim rc As New ADODB.Recordset ' 接続を確立する cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\My Documents\db1.mdb;" ' テーブル名を指定してレコードセットを作成する rs.Open "Table1", cn, adOpenKeyset, adLockOptimistic ************************************* > cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ > "Data Source=C:\My Documents\db1.mdb;" この部分の接続文字はどのようにしたら取得できるのでしょうか? SQLserverのときは、コンポーネントから Microsoft ADO Data Control 6.0(AP4)(OLEDB) を追加し、プロパティでOLE DBプロバイダを選択して接続文字を取得したのですが、accessに繋ぐのは初めてで、わかりません。 どなたか宜しくお願いいたします!!

  • この行は既に別のテーブルに属しています

    以下のソースで、「この行は既に別のテーブルに属しています。」というエラーが出てしまいますが、対処方法がわかりません。 どのようにしたらよろしいでしょうか? VS2003のVBです。     Dim Table1 As DataTable = Me.DS1.Tables("データベース1")     Dim Table2 As DataTable = Me.DS1.Tables("データベース2")     Dim Row1 As DataRow     Dim Row2 As DataRow     Row1("データ1") = 1     Row1("データ2") = 2     Row1("データ3") = 3     Row2("データ1") = 2     Row2("データ2") = 3     Row2("データ3") = 4     Table2.Rows.Add(Row2) ←ここでエラー     Table1.Rows.Add(Row1) 'System.ArgumentException' のハンドルされていない例外が system.windows.forms.dll で発生しました。 追加情報 : この行は既に別のテーブルに属しています。

  • Access ADP テーブル 説明欄を取得したい

    大変お世話になります。 Access 2007 ADPファイルにて SQL Server 2005 との接続でのシステムを運用しています。 テーブル情報のフィールド説明欄(Description) の値の一覧を取得したいと思い下記のプログラムを作ってみたのですが、Descriptionの値以外はおおむね取得できるのですが、説明欄のところがすべてエラーになってしまい説明欄の Description の取得ができません。 格納場所か、プロパティの参照の仕方が原因だと思うのですが、解決できません。 テーブルの説明欄(Description)値の参照の仕方をご存じの方がいらっしゃいましたら何卒ご教授いただければと存じます。 よろしくお願いいたします。     Dim Cn As ADODB.Connection     Dim Rs As New ADODB.Recordset     Dim SQL As String     Dim i As Integer          Set Cn = CurrentProject.Connection          SQL = " SELECT dbo.テーブルA.* "     SQL = SQL & " FROM dbo.テーブルA"     Dim MyDB As New ADOX.Catalog     Dim MyTable As ADOX.Table     Dim MyField As ADOX.Column     MyDB.ActiveConnection = CurrentProject.Connection     Set MyTable = MyDB.Tables("テーブルA")          Rs.Open SQL, Cn, adOpenForwardOnly, adLockReadOnly         For i = 0 To Rs.Fields.Count - 1             MsgBox Rs.Fields(i).Name                                     'MsgBox MyTable.Columns(Rs.Fields(j).Name).Properties("Description").Value             MsgBox Rs.Fields(i).Properties("Description").Value             MsgBox Rs.Fields(i).ActualSize             MsgBox Rs.Fields(i).Attributes             'MsgBox Rs.Fields(i).DataFormat             MsgBox Rs.Fields(i).DefinedSize             MsgBox Rs.Fields(i).NumericScale             'MsgBox Rs.Fields(i).OriginalValue             MsgBox Rs.Fields(i).Precision                          'MsgBox Rs.Fields(i).Properties("Description")                                      MsgBox Rs.Fields(i).Status             MsgBox Rs.Fields(i).Type             'MsgBox Rs.Fields(i).UnderlyingValue             MsgBox Rs.Fields(i).Value                  Next     Set MyDB = Nothing     Rs.Close     Set Rs = Nothing     Cn.Close     Set Cn = Nothing     Exit Sub

  • アクセスのテーブルに項目を追加するコードの作成方法

    現在作成済みのアクセスのテーブルにいくつかの項目を追加するプログラムを作っています。 「Name = "場所ドライブ"」 「.Name = "区画図ドライブ"」 「.Name = "区画図"」 以上の項目をテキスト型で追加したいのです。 同時に現在ある「Name = "場所"」というはすでに存在する項目を「OLEオブジェクト型」から「テキスト型」に変更したいのです。 単純に「Name = "場所"」をテキスト型で追加したコードを作成したら動きません。 どなたか助けていただけますか。下記にコードを書きます。                                          祥子 Private Sub コマンド1_Click() Beep If (MsgBox("データをアップデートします!!") = 7) Then End If Dim cnn As New ADODB.Connection Dim catDB As New ADOX.Catalog Dim colAdo As ADOX.Column Dim tbl As ADOX.Table Dim strCon As String Dim lIdx As Long strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" strCon = strCon & "Data Source=c:\ynet\Hz2data1.mdb" cnn.Open strCon catDB.ActiveConnection = cnn Set tbl = catDB.Tables![区画1] '変更か削除したいフィールド 'CurrentProject.Connection.Execute "ALTER TABLE [区画1] ALTER COLUMN 場所 TEXT(255)" '以下追加したいフィールド Set colAdo = New ADOX.Column With colAdo .Name = "場所ドライブ" .Type = adVarWChar .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "場所" .Type = adVarWChar .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "区画図ドライブ" .Type = adVarWChar .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "区画図" .Type = adVarWChar .Attributes = adColNullable End With

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?