トップ ページ > VisualBasic 2010(express) > VisualBasic 2010(express)でのOracle接続

VisualBasic 2010(express)でのOracle接続

環境:
<<メモ>>
Visual Basic Express版の場合、GUIでのオラクル接続のサポートはありません。
そのため、コード上で構築する必要があります。

Oracle Data Access Components (ODAC) for Windows のインストール

Oracle接続のドライバ群をインストールします。
  1. Oracleのサイトより、ODACをダウンロードし、インストールします。
    今回の環境はOracle11g(クライアント)なので、それに合わせたもの(ODTwithODAC1120320_32bit.zip)をダウンロードします。
    ※ダウンロードにはOracleサイトの登録(無料)が必要です。


    画像拡大
    クライアントを選択
    画像拡大
    [名前]に、既にインストール済のOraHomeを選択しなおす

※インストール画面は、進めるだけなので、細かい画面遷移は割愛します。

Visual Basic

今回作成するのは、「Windows フォーム アプリケーション」
  1. Visual Basicで、新規プロジェクトを作成する。

  2. その後、[プロジェクト] → [参照の追加] から「Oracle.DataAccess」を選択し、OKをクリックする。
    画像拡大画像拡大

  3. 念のため、プロジェクトプロパティ内の[参照]タブ内に「Oracle.DataAccess」が存在するかを確認する

    画像拡大

Visual Basic アプリケーションの作成

今回は、以下の「Windows フォーム アプリケーション」を作成します。
実行するとウィンドウが表示されます。
データを表示する部品「DataGridView」と、
画面上部にセレクタ用部品「BindingNavigator」あるだけで
非常にシンプルな画面です。

プロジェクト名とかもデフォルトのままで、手抜きです。

  1. フォームのコードを書きます
    '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(バインド-結びつける)という通り、それぞれの部品にデータを関連付ける場合、
    バインドでデータを保有する必要があります。

    開発過程において、関連付ける必要が出てくることは多いため、始めからバインドでデータを保有しましょう。
    <<メモ>>
    エラーが出る場合
    1. コード内の接続文字列を確認しましょう。
    2. TNSNAMES.ORAを使用する場合は、環境変数ORACLE_HOMEが設定されているか確認しましょう。
    3. 後述するdll群の不足がないか確認しましょう。
    4. 実行ファイルが置かれたフルパス上に、2バイト文字・特殊記号などが無いか確認しましょう。
  2. [発行]タブの「アプリケーションファイル」に、「Oracle.DataAccess.dll」を含め、発行する。

ユーザーへの配布

開発環境と同じ実行環境であれば、このまま動作しますが、
配布先にOracleがインストールされていない場合、以下ファイルを
実行ファイルと同じ場所にコピーする必要があります。
※以下パスは、ORACLE_HOME=C:\app\Administrator\product\11.2.0\client_1の場合
  1. C:\app\Administrator\product\11.2.0\client_1\ODP.NET\bin\4\Oracle.DataAccess.dll
    (これは発行する時に含めているので、再度コピーしなくても可)
  2. C:\app\Administrator\product\11.2.0\client_1\instantclient\oraociei11.dll
  3. C:\app\Administrator\product\11.2.0\client_1\BIN\oci.dll
  4. C:\app\Administrator\product\11.2.0\client_1\BIN\OraOps11w.dll
  5. 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
<<メモ>>
本当はもっと親切なエラー処理が必要です。
考えられるエラーをトラップし、対処方法をユーザーに分かりやすいメッセージで表示しましょう。