C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DBから全テーブル名を取得後、変数と一致すればレコード取得

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■87921 / inTopicNo.1)  DBから全テーブル名を取得後、変数と一致すればレコード取得
  
□投稿者/ wan (1回)-(2018/07/13(Fri) 16:18:36)

分類:[VB.NET/VB2005 以降] 

いつもお世話になっております。

「データベースから全てのテーブル名を取得し、変数(ここでは以下に登場するtableName)に設定されているテーブル名と一致するテーブル名があればレコードを取得し、
なければエラーメッセージを出してフォームを閉じる」というコードを書きたいです。
初心者丸出しの質問ではありますが、よければご教授をお願いします。
なお、すでに同じような解決済みの質問がある場合は、お手数ですがURLなどを張り付けていただけますと幸いです。



【開発環境】

VB2015、.NET Framework3.0、Oracle(データベース接続)


【コード】--------------------------------------------------------------------------

Try

  '接続文字列の指定
  connection = New OleDbConnection(省略)

  'コネクションの設定
  Dim cmd As New OleDbCommand() 'OleDbCommandのインスタンス化
  cmd.Connection = connection

  'SQL文でデータベース内の全てのテーブルを取得
  '変数tableNameには、あらかじめコマンドライン引数から取得したテーブル名が入っています。
  cmd.CommandText = "SELECT * FROM DBA_TABLES ORDER BY OWNER,TABLE_NAME" 

  '接続
  connection.Open()

  '変数に入っているテーブル名がデータベース内に存在している場合
  If cmd.CommandText = tableName Then 
  
    'テーブルからレコードを取得(省略)

  Else

      '存在しない場合
      MessageBox.Show("DBに対象のテーブルが存在していません。,
                       "エラー",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error)

        'フォームを閉じる
        Close()

    End If

Catch ex As Exception

    ・
    ・ 
    ・

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



一応今は上記のように書いていますが、これだとエラーメッセージの方に飛んでしまうので、
訂正などあればよろしくお願いします。



【参考サイト】

・「[VB.NET]OLEDBを使用してOracleへ接続する」
http://www.curict.com/development/dotNET/ADONET/ADONET_OracleConnect.html

・「テーブルの一覧を取得する(USER_TABLES / ALL_TABLES)」
https://www.projectgroup.info/tips/Oracle/SQL/SQL000019.html

引用返信 編集キー/
■87922 / inTopicNo.2)  Re[1]: DBから全テーブル名を取得後、変数と一致すればレコード取得
□投稿者/ shu (1131回)-(2018/07/13(Fri) 16:45:06)
No87921 (wan さん) に返信


>   cmd.CommandText = "SELECT * FROM DBA_TABLES ORDER BY OWNER,TABLE_NAME" 
(1)ここで設定した内容CommandText

>
>   '接続
>   connection.Open()
>
>   '変数に入っているテーブル名がデータベース内に存在している場合
>   If cmd.CommandText = tableName Then 
(2)ここで参照しているCommandText

(1)と(2)は同じなのでtableNameが
"SELECT * FROM DBA_TABLES ORDER BY OWNER,TABLE_NAME"
でない限り一致することはないです。



引用返信 編集キー/
■87923 / inTopicNo.3)  Re[2]: DBから全テーブル名を取得後、変数と一致・・・
□投稿者/ wan (2回)-(2018/07/13(Fri) 17:02:43)
2018/07/13(Fri) 17:23:30 編集(投稿者)
No87922 (shu さん) に返信

shuさん、返信ありがとうございます。

>>  cmd.CommandText = "SELECT * FROM DBA_TABLES ORDER BY OWNER,TABLE_NAME" 
> (1)ここで設定した内容CommandText 
> 
>>
>>  '接続
>>  connection.Open()
>>
>>  '変数に入っているテーブル名がデータベース内に存在している場合
>>  If cmd.CommandText = tableName Then 
> (2)ここで参照しているCommandText
> 
> (1)と(2)は同じなのでtableNameが
> "SELECT * FROM DBA_TABLES ORDER BY OWNER,TABLE_NAME"
> でない限り一致することはないです。


確かにその通りです…。

実際にデータベース内で"SELECT * FROM DBA_TABLES ORDER BY OWNER,TABLE_NAME"を実行したところ、
TABLE_NAMEに欲しいテーブル名があるということが分かりました。

なので、今はどうすればTABLE_NAME内からtableNameと一致するテーブルを見つけられるのかを考えています。
引き続きご教授よろしくお願いします。


(以下編集後)

SQL文を

"SELECT TABLE_NAME 
FROM DBA_TABLES 
WHERE OWNER LIKE '%[OWNER名]%'"

として、テーブル名の一覧を取得しました。

引用返信 編集キー/
■87924 / inTopicNo.4)  Re[3]: DBから全テーブル名を取得後、変数と一致すればレコード取得
□投稿者/ 魔界の仮面弁士 (1741回)-(2018/07/13(Fri) 17:25:28)
No87923 (wan さん) に返信
> どうすればTABLE_NAME内からtableNameと一致するテーブルを見つけられるのか

cmd.CommandText を「実行」して、結果を受け取る必要がありますね。

(案1) cmd.ExecuteReader メソッドで OleDbDataReader クラスのオブジェクトを受け取り、
 そこからテーブル名を一つずつ受け取っていく。

(案2) OleDbDataAdapter クラスの Fill メソッドに、DataTable オブジェクトを渡し、
 そこからテーブル名の一覧を得る。
引用返信 編集キー/
■87926 / inTopicNo.5)  Re[4]: DBから全テーブル名を取得後、変数と一致すればレコード取得
□投稿者/ PANG2 (224回)-(2018/07/13(Fri) 17:39:24)
(案3)SELECT文のWHERE節で絞る
引用返信 編集キー/
■87927 / inTopicNo.6)  Re[5]: DBから全テーブル名を取得後、変数と一致・・・
□投稿者/ wan (4回)-(2018/07/13(Fri) 18:00:56)
2018/07/17(Tue) 09:09:37 編集(投稿者)
2018/07/13(Fri) 18:28:52 編集(投稿者)
2018/07/13(Fri) 18:16:40 編集(投稿者)

No87924 (魔界の仮面弁士 さん) に返信
No87926 (PANG2 さん) に返信

魔界の仮面弁士さん、PANG2さん回答ありがとうございます。

> cmd.CommandText を「実行」して、結果を受け取る必要がありますね。
>
> (案1) cmd.ExecuteReader メソッドで OleDbDataReader クラスのオブジェクトを受け取り、
>  そこからテーブル名を一つずつ受け取っていく。
>
> (案2) OleDbDataAdapter クラスの Fill メソッドに、DataTable オブジェクトを渡し、
>  そこからテーブル名の一覧を得る。

> (案3)SELECT文のWHERE節で絞る


とりあえず(案1)をやってみようと思い、
http://blog.livedoor.jp/akf0/archives/51431331.html のサイトを参考に、

'SQLの結果を取得する
Dim odr As OleDbDataReader
odr = cmd.ExecuteReader() '@
cmd.Dispose()

としてみました。

これで取得した結果を配列に入れて、その要素の中からtableNameと一致するものを特定できれば・・・
と考えたのですが、どうでしょうか?それとももうこれは配列に入ってる状態なんでしょうか・・・?

とりあえず上記のサイトを基に、

While odr.Read

  MsgBox(odr(0).ToString & ",")

End While

として表示しようと思ったんですが、@の部分で例外がCatchされてしまいました・・・。

【編集箇所1】
エラー内容は「ora 00911文字が無効です」でした。

【編集箇所2】
たびたび編集すみません。
例外発生原因はSQL文の最後にセミコロンを記述していたことでした・・・。
とりあえずMsgBoxで全テーブル名を取得できていることが分かったので、
今度はこれらの中から一致するものの取得法を考えようと思います。


あとは調べたらできそうなので、解決済みにさせていただきます。
皆様回答ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ