環境:
- Oracle Database 11g (11.2)(32-Bit)
- Oracle Client 11g (11.2)(32-Bit)
※クライアントはランタイムです
- Visual Basic 2010 Express
※今回作成するのは、「Windows フォーム アプリケーション」です
<<メモ>>
Visual Basic Express版の場合、GUIでのオラクル接続のサポートはありません。
そのため、コード上で構築する必要があります。
Oracle Data Access Components (ODAC) for Windows のインストール
Oracle接続のドライバ群をインストールします。
- Oracleのサイトより、ODACをダウンロードし、インストールします。
今回の環境はOracle11g(クライアント)なので、それに合わせたもの(ODTwithODAC1120320_32bit.zip)をダウンロードします。
※ダウンロードにはOracleサイトの登録(無料)が必要です。
| |
→画像拡大 クライアントを選択 | →画像拡大 [名前]に、既にインストール済のOraHomeを選択しなおす |
※インストール画面は、進めるだけなので、細かい画面遷移は割愛します。
Visual Basic
今回作成するのは、「Windows フォーム アプリケーション」
-
Visual Basicで、新規プロジェクトを作成する。
-
その後、[プロジェクト] → [参照の追加] から「Oracle.DataAccess」を選択し、OKをクリックする。
-
念のため、プロジェクトプロパティ内の[参照]タブ内に「Oracle.DataAccess」が存在するかを確認する
→画像拡大
Visual Basic アプリケーションの作成
今回は、以下の「Windows フォーム アプリケーション」を作成します。
実行するとウィンドウが表示されます。
データを表示する部品「DataGridView」と、
画面上部にセレクタ用部品「BindingNavigator」あるだけで
非常にシンプルな画面です。
プロジェクト名とかもデフォルトのままで、手抜きです。
- フォームのコードを書きます
'ODP.NETの名前空間を追加
Imports Oracle.DataAccess.Client
Public Class Form1
'データバインドで使用
Private customersBindingNavigator As New BindingNavigator(True)
Private customersBindingSource As New BindingSource()
'データセットの作成
'他からも使用できるようにクラス変数にし、スコープをsharedにしておく
Shared ds As DataSet = New DataSet()
Shared table As New DataTable()
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
'TNSNAMES.ORAを使用しないので、接続情報を直接を記載する
Dim oradb As String = "Data Source=(DESCRIPTION=" _
+ "(ADDRESS=(PROTOCOL=TCP)(HOST=HOSTNAME)(PORT=1521))" _
+ "(CONNECT_DATA=(SERVICE_NAME=ORCL.grot3.com)));" _
+ "User Id=orcladm;Password=orcladm;"
'TNSNAMES.ORAを使用する場合
'Dim oradb As String = "Data Source=ORCL.grot3.com;User Id=orcladm;Password=orcladm;"
'コネクト用のオブジェクト準備
Dim conn As New OracleConnection(oradb)
conn.Open()
'SQL文の作成(SQL末尾に;は付けない)
Dim sql As String = "select * from TEST01TBL"
Dim cmd As New OracleCommand(sql, conn)
cmd.CommandType = CommandType.Text
'アダプタの作成
Dim adapter As OracleDataAdapter = New OracleDataAdapter(sql, conn)
adapter.Fill(ds, "TABLE1")
'バインドデータの作成
customersBindingSource.DataSource = ds.Tables("TABLE1")
'部品「BindNavigator」へのバインドデータ割り当て
Me.BindingNavigator1.BindingSource = customersBindingSource
'部品「DataGridView」へのバインドデータ割り当て
Me.DataGridView1.DataSource = customersBindingSource
'部品「DataGridView」を読み取り専用に
Me.DataGridView1.ReadOnly = True
'使ったオブジェクトをクローズする
conn.Close()
End Sub
End Class
<<メモ>>
bind(バインド-結びつける)という通り、それぞれの部品にデータを関連付ける場合、
バインドでデータを保有する必要があります。
開発過程において、関連付ける必要が出てくることは多いため、始めからバインドでデータを保有しましょう。
<<メモ>>
エラーが出る場合
- コード内の接続文字列を確認しましょう。
- TNSNAMES.ORAを使用する場合は、環境変数ORACLE_HOMEが設定されているか確認しましょう。
- 後述するdll群の不足がないか確認しましょう。
- 実行ファイルが置かれたフルパス上に、2バイト文字・特殊記号などが無いか確認しましょう。
-
[発行]タブの「アプリケーションファイル」に、「Oracle.DataAccess.dll」を含め、発行する。
ユーザーへの配布
開発環境と同じ実行環境であれば、このまま動作しますが、
配布先にOracleがインストールされていない場合、以下ファイルを
実行ファイルと同じ場所にコピーする必要があります。
※以下パスは、ORACLE_HOME=C:\app\Administrator\product\11.2.0\client_1の場合
- C:\app\Administrator\product\11.2.0\client_1\ODP.NET\bin\4\Oracle.DataAccess.dll
(これは発行する時に含めているので、再度コピーしなくても可)
- C:\app\Administrator\product\11.2.0\client_1\instantclient\oraociei11.dll
- C:\app\Administrator\product\11.2.0\client_1\BIN\oci.dll
- C:\app\Administrator\product\11.2.0\client_1\BIN\OraOps11w.dll
- C:\app\Administrator\product\11.2.0\client_1\BIN\orannzsbb11.dll (これは無くてもできた)
内容がゴチャゴチャしないように、最少単位で書きました
あくまでもメモなので、Oracle接続が確認できたら、
あとは正しい書き方でアプリケーション開発をしましょう。
また、dllの配布はライセンス的な論争がありますが、
とりあえずこれで「技術的にはできる」ということです。
エラー処理
…省略…
'接続からのエラー処理
Try
conn.Open()
…省略…
conn.Close()
'ORA-XXXXのエラーをメッセージボックスにそのまま表示します。
Catch ex As OracleException
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical, "エラー")
End Try
<<メモ>>
本当はもっと親切なエラー処理が必要です。
考えられるエラーをトラップし、対処方法をユーザーに分かりやすいメッセージで表示しましょう。