投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/8/28 14:27:26
> データベース一覧を取得しようとしています。
「データベース一覧」…?
Access のデータベースって、*.accdb や *.mdb ファイルのことですよね?

もしかして、「テーブル一覧」のことですか?

> New String(){Nothing. Nothing. Nothing. "TABLE"}
「.」ではなく「,」ですよね。


> Using cn As New OdbcConnection (odbcdrv)
あれ。Access Database への接続なのに、
OleDbConnection ではなく、OdbcConnection で繋いでいるのですね。珍しい。

> Dim odbcdrv As String = "Driver = {Microsoft Access Driver (*.mdb, *.accdb)}:DBQ=" & DBpath & "; Uld=" & DBID & "; Pwd =;" & DBPW
接続文字列の文法が間違っています。
「:」ではなく「;」ですよね。

そもそも、そのような文字列埋め込み処理ではインジェクション問題を引き起こしかねません。
OdbcConnectionBuilder や
OleDbConnectionBuilder を用いて構築すべきです。

Dim builder As New OdbcConnectionStringBuilder()
builder.Driver = "Microsoft Access Driver (*.mdb, *.accdb)"
builder("DBQ") = DBpath
builder("Uid") = DBID
builder("Pwd") = DBPW
Using cn As New OdbcConnection(builder.ConnectionString)



> この中からSYSTEM TABLEを除外するために第二引数を設定するとうまくいきません。
TABLE_TYPE 条件は指定できません。

Tables スキーマで指定できる条件は、
「TABLE_CAT」「TABLE_SCHEM」「TABLE_NAME」の 3 条件だけです。

TABLE_TYPE 条件が必要な場合は、Linq もしくは DataView で絞りこみましょう。

DataTable = cn.GetSchema("Tables")
DataTable.DefaultView.RowFilter = "TABLE_TYPE<>'SYSTEM TABLE'"