VB.NET ODP.NETでOracleのデータをSELECTする
ODP.NET
を使用してOracle
データベースのテーブルのデータをSELECT
する方法を紹介します。
以下はテーブルからデータを取得するサンプルです。
(以下はわかりやすくするため1つのファンクションで実行していますがSQLごとにファンクション化する方法を記事の最後で紹介しています)
Imports Oracle.DataAccess.Client 'ファイルの先頭に追加
Public Function SelectData() As DataSet
Dim ds As New DataSet
Using conn As OracleConnection = New OracleConnection(接続文字列)
'コネクションOpen
conn.Open()
Dim sql As StringBuilder
'TABLE_Aのデータを取得
sql = New StringBuilder
sql.AppendLine(" SELECT ")
sql.AppendLine(" T1.COL1 ")
sql.AppendLine(" ,T1.COL2 ")
sql.AppendLine(" FROM ")
sql.AppendLine(" TABLE_A T1 ")
Using cmd As New OracleCommand(sql.ToString(), conn)
Using da As OracleDataAdapter = New OracleDataAdapter(cmd)
da.Fill(ds, "TABLE_A")
End Using
End Using
'TABLE_Bのデータを取得
sql = New StringBuilder
sql.AppendLine(" SELECT ")
sql.AppendLine(" T1.COL1 ")
sql.AppendLine(" ,T1.COL2 ")
sql.AppendLine(" FROM ")
sql.AppendLine(" TABLE_B T1 ")
Using cmd As New OracleCommand(sql.ToString(), conn)
Using da As OracleDataAdapter = New OracleDataAdapter(cmd)
da.Fill(ds, "TABLE_B")
End Using
End Using
End Using
Return ds
End Function
TABLE_A
とTABLE_B
からSELECT
のSQL
を実行しています。
OracleDataAdapter
を使用しています。
da.Fill(データセット, テーブル名)
の形式で実行すると、SELECT
した結果をDataTable
として取得して、データセットに追加されます。
SQL文の組み立てはパフォーマンスの観点からString
ではなくStringBuilder
を使用することが多いです。
また、Try-Catch
を使った方法をよく見かけますが、Using
を使用したほうがコネクションなどのオブジェクトを破棄する処理を記載する必要がなくなり、シンプルになります。
取得したデータのアクセス方法
取得した結果は以下のようにアクセスできます。
上記で取得した結果は変数ds
(DataSet)に格納されているとします。
da.Fill(データセット, テーブル名)
で取得する際に指定したテーブル名をキーにしてDataTable
を取得します。
SQLで取得したカラム名を指定してDBから取得した値にアクセスできます。
Dim tableA As DataTable = ds.Tables("TABLE_A")
Dim tableB As DataTable = ds.Tables("TABLE_B")
'1行目のCOL1の値を取得
tableA.Rows(0).Item("COL1")
SQLごとにファンクション化
長いSQL文を組み立てる必要がある場合があると、ファンクションが長くなりがちですので、実行するSQLごとにファンクションを作成して、処理を見やすくします。
Imports Oracle.DataAccess.Client 'ファイルの先頭に追加
Public Function SelectData() As DataSet
Dim ds As New DataSet
Using conn As OracleConnection = New OracleConnection(接続文字列)
'コネクションOpen
conn.Open()
'TABLE_Aのデータを取得
SelectTABLE_A(conn, ds)
'TABLE_Bのデータを取得
SelectTABLE_B(conn, ds)
End Using
Return ds
End Function
Private Sub SelectTABLE_A(ByVal conn As OracleConnection, ds As DataSet)
Dim strSQL As StringBuilder
'TABLE_Aのデータを取得
sql = New StringBuilder
sql.AppendLine(" SELECT ")
sql.AppendLine(" T1.COL1 ")
sql.AppendLine(" ,T1.COL2 ")
sql.AppendLine(" FROM ")
sql.AppendLine(" TABLE_A T1 ")
Using cmd As New OracleCommand(sql.ToString(), conn)
Using da As OracleDataAdapter = New OracleDataAdapter(cmd)
da.Fill(ds, "TABLE_A")
End Using
End Using
End Function
Private Sub SelectTABLE_B(ByVal conn As OracleConnection, ds As DataSet)
Dim strSQL As StringBuilder
'TABLE_Aのデータを取得
sql = New StringBuilder
sql.AppendLine(" SELECT ")
sql.AppendLine(" T1.COL1 ")
sql.AppendLine(" ,T1.COL2 ")
sql.AppendLine(" FROM ")
sql.AppendLine(" TABLE_B T1 ")
Using cmd As New OracleCommand(sql.ToString(), conn)
Using da As OracleDataAdapter = New OracleDataAdapter(cmd)
da.Fill(ds, "TABLE_B")
End Using
End Using
End Function