ご協力いただき、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など どれもうまく取得できませんでした。
よろしくご教示ください。
なんとかできました。
ポイントは、
{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
---------------------------------------------------------
質問者
お礼
大変お手数をかけたようで申しわけありません。理由などがあまり理解できずにコーディングを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() 'これは不要でした
ありがとうございました。
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()
-------------------------------------------
何か問題がありましたらレスください。
質問者
補足
回答ありがとうございます。
ご指示のとおり、コーディングしたつもりですが
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 の時)も取得したいのですが。
よろしくお願いいたします。
お礼
大変お手数をかけたようで申しわけありません。理由などがあまり理解できずにコーディングを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() 'これは不要でした ありがとうございました。