非接続型のデータ取得についてのメモです。
非接続型では、データを取得した後はデータベースに接続している必要はありません。
取得したデータは、DataSetオブジェクトやDataTableオブジェクトに格納されます。DataSetはメモリ内データストアです。
DataSet/DataTable等を詳しく知りたい方は、ADO.NETでググってみましょう。
Oracle DataAccessへの参照を追加してください。
サンプル EMP表の内容を取得し表示する。
Imports Ora = Oracle.DataAccess.Client Public Class Form1 Private dtEMP As DataTable = Nothing Private Sub getData()
Dim oraDa As Ora.OracleDataAdapter = Nothing
Const cmdSelect As String = _ "select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO " & _ "from EMP" Try 'OracleDataAdapter インスタンス化 oraDa = New Ora.OracleDataAdapter( _ cmdSelect, _
"data source=orcl;User id=scott;Password=tiger;") 'データテーブル インスタンス化 dtEMP = New DataTable 'DataTable作成 oraDa.Fill(dtEMP) 'DataGridViewのデータソースにセット DataGridView1.DataSource = dtEMP Catch ex As Ora.OracleException MessageBox.Show("Oracleエラー" & vbCrLf & ex.Message) Catch ex As Exception MessageBox.Show("エラー" & vbCrLf & ex.Message) Finally If Not IsNothing(oraDa) Then oraDa.Dispose() End If End Try End Sub Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click getData() End Sub End Class
DataAdapterを利用し、DataTableに取得した行をセットします。そのDataTableをDataGridViewオブジェクトのDataSourceにセットしています。DataGridViewはDataTableの内容に従い自動でグリッドを作成しています。
ここではSelectコマンドと、ConnectionStringに接続文字列をセットし、インスタンス化します。
Fill を呼び出す前に接続が閉じていた場合は、接続が開かれ、データを取得した後で再び閉じられます。Fill を呼び出す前に接続が開いていた場合は、接続は開いたままです。
Fillコマンドにより、Oracle上の選択条件を満たすレコードが戻され、内容はdtEMP(DataTableオブジェクト)に格納されます。
上記例ではFillコマンドを実行して、DataTableにデータをセットしましたが、その後、もう一度Fillコマンドを実行しても、1回目のデータはDataTableから消えません。つまり、上書きしません。異なるSQLを投げても新しい列名が出てきたら列も追加されます。
これは、面白いですよね??
そんなの必要ない場合は、DataTableをNewするなり、Clearするなりします。
サンプル EMP表の内容を取得し表示する。
次に別名を付けたSQLを投げてみます。
EMPNOをEMPNO2,ENAMEをENAME2としてSQLを投げてみました。するとEMPNO,ENAMEはNULLで表示され、EMPNO2,ENAME2は列が追加されています。