はじめに
.NETアプリケーションからOracleへ接続するための最善の方法は、Oracle社が提供している「Oracle Data Provider for .NET」(以下、ODP.NET)です。なぜ、ODP.NETが最善の方法かというと、以下の2つの理由からです。
- Oracle接続に最適化されているため、パフォーマンスが良い
- Oracle独自の機能が使用可能
今回は、このODP.NETを使用するために必要な準備とOracleに接続するための簡単なコードを紹介します。
対象読者
- Visual Basic、もしくはC#を使ってプログラムを作ったことのある人。
- Oracleデータベース対応アプリケーション開発に興味のある人。
必要な環境
Microsoft .NET Framework 1.0 以上が必要です。また、ODP.NETから接続可能なOracleデータベースとして、Oracle8i R8.1.7.4以上が必要になります。
ODP.NETのインストール
ODP.NETのインストーラは、Oracle Technology Network(以下、OTN)からダウンロードできます。
上記サイトから、[Oracle Data Provider for .NET 2.0 10.2.0.2.20]をクリックし、[Oracle Developer Tools for Visual Studio .NET with ODAC 10.2.0.2.20]をクリックします(ここからはOTNへのログインが必要になり、ログインしていない場合は、ログインを行う画面が表示されます)。
ライセンス契約書が表示されるので、すべての内容を確認して必要なチェックボックスをオンにし[同意する]ボタンをクリックすると、ファイルのダウンロードページが表示されます。[ODTwithODAC10202.exe]をクリックすると、ファイルのダウンロードが開始します。インストール方法の詳細は、同ページの[インストール手順]を参照してください。
Oracleへの接続確認
ODP.NETのインストールが完了したら、ODP.NETからOracleにアクセスしてみましょう。ODP.NETはADO.NET 2.0に対応しており、ADO.NET 2.0の特徴的な機能であるDbProviderFactory
クラスに対応しています。ODP.NETをインストールすると、ADO.NET 2.0 database factory classと、machine.configのDbProviderFactoriesに登録されます。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <configSections> <section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </sectionGroup> </configSections> <system.data> <DbProviderFactories> <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </system.data> </configuration>
従来のADO.NETでは、使用するデータ・プロバイダによってSystem.Data.SqlClient名前空間(SQL Server用)、Oracle.DataAccess. Client名前空間(Oracle用)、System.Data.OleDb名前空間(OLE DBプロバイダ用)などを、それぞれ使い分ける必要がありました。しかし、これではコードが個別のデータ・プロバイダに依存してしまいます。そこでADO.NET 2.0では、データ・プロバイダに依存しない汎用クラスが追加されています。
具体的には、System.Data.Common名前空間に追加されたDbConnection
、DbCommand
、DbDataReader
、DbParameter
などのクラスです。これらの汎用クラスは、DbProviderFactory
クラスのCreatexxxxx
メソッドを介して取得することができます。DbFactory
クラスを参照するためには、名前空間をインポートします。
Imports System.Data.Common
using System.Data.Common;
以下、DbFactory
クラスを利用したコードになります。
Private Sub DbConnect() 'ProviderFactoryの設定 Dim factory As DbProviderFactory = _ DbProviderFactories.GetFactory("Oracle.DataAccess.Client") Dim csbuilder As DbConnectionStringBuilder = _ factory.CreateConnectionStringBuilder csbuilder("Data Source") = "ORCL10GR2" csbuilder("User ID") = "Scott" csbuilder("Password") = "Tiger" 'データベース接続 Dim conn As DbConnection = factory.CreateConnection() conn.ConnectionString = csbuilder.ConnectionString conn.Open() 'データアクセス処理 Dim cmd As DbCommand = factory.CreateCommand() cmd.Connection = conn cmd.CommandType = CommandType.Text cmd.CommandText = "SELECT * FROM emp" Dim reader As DbDataReader = cmd.ExecuteReader() Do While reader.Read() '処理の実行 Loop 'Close conn.Close() conn.Dispose() End Sub
private void DbConnect(){ // ProviderFactoryの設定 DbProviderFactory factory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); DbConnectionStringBuilder csbuilder = factory.CreateConnectionStringBuilder(); csbuilder("Data Source") = "ORCL10GR2"; csbuilder("User ID") = "Scott"; csbuilder("Password") = "Tiger"; // データベース接続 DbConnection conn = factory.CreateConnection(); conn.ConnectionString = csbuilder.ConnectionString; conn.Open(); // データアクセス処理 DbCommand cmd = factory.CreateCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM emp"; DbDataReader reader = cmd.ExecuteReader(); while(reader.Read()){ // 処理の実行 } // Close conn.Close(); conn.Dispose(); }
上記のようなコードを記述すると、接続先のデータベースに依存しない汎用的なコードでアプリケーションを開発できます。データベースが切り替わった場合は、DbProviderFactories
クラスのGetFactory
メソッドで、新たな接続先に対応したデータ・プロバイダを指定し、接続先情報、ユーザーID、パスワードを指定し直すだけです。