アーカイブ
Oracle Data Provider for .NET 12.1のODP.NET管理対象ドライバ
手違いで記事が消えてしまったので、11/13日の記事を再投稿します。
Oracleのトレース関係を調べていて今更ながら気づいたんですが、ODP.NETの最新版が7月にリリースされていたんですね。
Oracle® Data Provider for .NET開発者ガイド 12cリリース1 (12.1)
Oracle Data Provider for .NETの変更点
http://docs.oracle.com/cd/E49329_01/win.121/b72971/release_changes.htm#BABGBIEB
- 32-bit Oracle Data Access Components (ODAC) with Oracle Developer Tools for Visual Studio
- 32-bit Oracle Data Access Components (ODAC) Downloads
- 64-bit Oracle Data Access Components (ODAC) Downloads
この中で気になったのが、ODP.NET管理対象ドライバというもの。ドキュメントを読む限りでは、ODP.NET 12.0.1以降ではODP.NETの本体であるOracle.DataAccess.Client.dllを置き換えるアセンブリ(と名前空間)として、Oracle.ManagedDataAccess.dllが利用できるようになり、マネージドなDLLだけでOracleに接続できるようになったらしい。しかもTNSなんかの設定もapp.configやweb.configで行えるらしい。
設定ファイルの修正
DbProviderFactories経由で利用している場合、設定ファイルの変更だけで対応ができます。例えばこんなコードで利用しているなら、web.configやapp.configに定義したconnectionStringのproviderNameをOracle.DataAccess.ClientからOracle.ManagedDataAccess.Clientに変更するだけです。
Dim connectionStringName = ConfigurationManager.AppSettings("DefaultConnectionStringName")
Dim connectionString = ConfigurationManager.ConnectionStrings(connectionStringName)
Dim factory = DbProviderFactories.GetFactory(connectionString.ProviderName)
Using connection = factory.CreateConnection()
connection.ConnectionString = connectionString.ConnectionString
connection.Open()
Using selectCommand = connection.CreateCommand()
selectCommand.CommandText = "select sysdate from dual"
Console.WriteLine(selectCommand.ExecuteReader().ToString())
End Using
connection.Close()
End Using
web.config/app.config
<connectionStrings>
<add name="OracleConString"
providerName="Oracle.ManagedDataAccess.Client"
connectionString="DATA SOURCE=XXX;USER ID=XXX;Password=XXX" />
connectionStrings>
OracleClientがインストールされていない環境で動かしてみる。
ODP.NET管理対象ドライバの基本的な機能は分散トランザクション関連の機能を除き、64bitと32bitで差が無いようです。ODP.NET_Managed121010.zipをダウンロードしてZIPファイルをインストールフォルダー(C:\odp.netあたり)に解凍します。インストールに関する詳しい記述はOracle Data Provider for .NET管理対象ドライバのインストールを参考にしてください。CPUアーキテクチャー毎に用意されたconfigure.batを実行します。64bit OSにインストールする場合は"C:\odp.net\managed\x64\configure.bat"ですね。
動きました。
ODACがインストールされていない環境で動かしてみる。
あれ?マネージドだけで動くってことは、設定ファイルと必要なDLLをローカルコピーでおいてやれば、ODACなくても動くんじゃね?ってことで、app.configにDbProviderFactoriesのエントリーを登録して見ます。
<DbProviderFactories>
<clear/>
<add name="ODP.NET, Managed Driver"
invariant="Oracle.ManagedDataAccess.Client"
description="Oracle Data Provider for .NET, Managed Driver"
type="Oracle.ManagedDataAccess.Client.OracleClientFactory,
Oracle.ManagedDataAccess, Version=4.121.1.0,
Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</DbProviderFactories>
DLLが無いとおこられたので、CPUに応じたOracle.ManagedDataAccess.dllを同じフォルダーに入れてあげます。
動きました。
関連ドキュメント
OracleClientをインストールしなくても動くのはいいですね。ただ、Oracle.DataAccess.Clientとは差異がアルようなのでODP.NET管理対象ドライバを利用する場合は、このあたりのドキュメントに目を通しておいたほうがいいでしょう。
えっ!!ODP.NETをNugetでインストール!?
Oracle関連の調べ物をしていて、今更ながらVisual Studio 2012に対応したODAC 11.2 Release 5の存在に気づいたわけですが、こいつの詳細を調べていたらnugetにODP.NETとODACが登録されているのを発見しました。
ODP.NET
Oracle Data Provier for .NET (ODP.NET) x86 112.3.20
Oracle Data Provier for .NET (ODP.NET) x64 112.3.20
ODAC
ODACのnugetパッケージを作っているのはOracleではなくて、milesibstosさんという方らしいです。
ODAC 11.2 Release 5 (11.2.0.3.20) with Xcopy Deployment(x86)
ODAC 11.2 Release 5 (11.2.0.3.20) with Xcopy Deployment(x64)
ODACをインストールすると、Nugetのパッケージフォルダーに関係するODP.NETも同時にインストールされます。インストールされたフォルダーを見ると、インストールされたのはDLLが8個だけ、、、えっこれだけで動作するはずが、、、
実行してみる。。。
とりあえず、超シンプルなコードを書いて実行してみる。。。。あれ?
System.TypeInitializationException: ‘Oracle.DataAccess.Client.OracleConnection’ のタイプ初期化子が例外をスローしました。 —> Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client
場所 Oracle.DataAccess.Client.OracleInit.Initialize()
場所 Oracle.DataAccess.Client.OracleConnection..cctor()
— 内部例外スタック トレースの終わり —
場所 Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
場所 WindowsApplication4.Form1.Button1_Click(Object sender, EventArgs e) 場所 C:\Users\Sugiyama\Documents\Visual Studio 2012\Projects\WindowsApplication4\WindowsApplication4\Form1.vb:行 9
Nugetのパッケージページを見るとこんなサマリーが。どうやらこのNugetパッケージにはOracleを使ったアプリケーションをコンパイルするために必要なDLLだけが含まれているようですね。
This NuGet package contains Oracle.DataAccess.dll (x86 – both the net20 and net40 versions) needed to compile a project that uses Oracle’s ODP.NET Library. Oracle will still need to be installed on the production or development machine in order to connect to Oracle (those libraries are greater than 100MB in size, so it didn’t make sense to include them in a NuGet package), but this package will at least allow the project to be successfully built (i.e. if you’re using a CI server).
LINQ PadでOracleのテーブルに対してクエリーを発行する。
LINQ Padは言わずと知れたLINQ実行環境です。
こいつを使えば、LINQ to ObjectsやLINQ to XML、LINQ to SQL、LINQ to Entitiesなんかに対するクエリーをさらっと記述してさらっと動作確認することができます。クエリの結果もわかりやすく構造化されて表示されるのでちょっと確認するにはぜひ手元においておきたいツールです。
今回はOracleに対してLINQ PadからLINQクエリーを発行するにはどうしたらいいんだろう?って話です。
IQ(IQ Toolkit)のインストール
LINQ PadでSQL Server以外のRDBMSにクエリーを発行する場合は、CodePlexで公開されているIQToolkitを利用します。LINQ Padからインストールする場合は、Choose a Driverウインドウからダウンロードしてインストールすることができます。
ここでは他にも下記のドラーバーをインストールすることができます。
- IQ Driver – for MySQL、SQLite、Oracle
- Microsoft Streamlnsight Driver
- Azure Table Strage Driver
- Mindscape LightSpeed Driver
- LLBLGen Pro Drivers
- DevExpress eXpress Persistent Objects Driver
- DevForce LINQPad Driver
- NoSQL FileDb Driver
Oracleへの接続
新しいデータソースを追加するには、LINQ PadのAdd connectionリンクからChoose Data Contextウインドウを表示し、先程インストールしたIQ(Supports Oracle, MySQL, SQLite)を選択します。
続けてRDBMSの接続方法を定義します。今回はクライアント側にOracleクライアントがインストール済みなのでOCIを選択しました(簡易TNSって楽でいいですねー)。Oracle Clientがインストールされていない環境用にDirect接続もできるようですが、AdvancedタブでSIDやもろもろを設定しても上手くつながりませんでした。
テーブル名を複数形にする必要は無いので、Pluralize EntitySet and table propertiesはOFF、テーブル名のアンダーバーを削ったり短くしたりする必要もないのでCapitalize Property NamesもOFFでデータソースを定義します。
クエリーを実行してみる。
ORACLE側で定義されているテーブルに対して、LINQ経由でクエリーを実行してみましょう。
CREATE TABLE KARUATEST (
ID NUMBER(28) NOT NULL,
NAME VARCHAR2(100),
CONSTRAINT PK_KARUATEST PRIMARY KEY(ID)
)
NAMEの先頭が”karua”で始まっているもの。
でました。
大文字、小文字無視で。
KARUATEST.Where(user =>
user.NAME.StartsWith("karua", StringComparison.InvariantCultureIgnoreCase))
SELECT t0.ID, t0.NAME
FROM KARUATEST t0
WHERE (t0.NAME LIKE :p0 || '%')
KARUATEST.Where(user => user.
NAME.ToUpper().StartsWith("karua".ToUpper()))
SELECT t0.ID, t0.NAMEFROM KARUATEST t0
WHERE (UPPER(t0.NAME) LIKE :p0 || '%')
まとめ
実際の動作は各LINQプロバイダーによって動作が変わってくるので、実際の動作は動作環境に合わせてプログラム側で確認する必要があります。場合によっては、IQ側ではサポートされているけれど、ODP.NET側ではサポートされていないってことがあり得る。
もちろん実際のプログラムにでもIQToolkitを使ってプログラミングしてあげればいいんでしょうが、そうも言えないと思うので、LINQ Padでの確認は、こんな文法で行けるかなってのをなんとなく確認するという感じにとどめたほうがいいでしょう。
Oracle SQL Developer 3.1.07.42でオブジェクトの一覧が表示されないのが治った。
Windowsのドメインサーバーを変更したタイミングで、Oracle SQL Developer(3.0.04)でこんなエラーが表示されて、テーブルの一覧やViewの一覧などが表示されなくなってしまいました。Javaのランタイム有り・無しとか、32Bit版でインストールしてみたりとかやっても、全く変わらずだったので、すっかり諦めていました。
o.d.db.DBUtil(oracle.dbtools.db.DBUtil) 警告、未処理例外:クローズされた例外です。
同僚のN君から、SQL Developerの最新版が出たよーと教えてもらったので、早速ここからダウンロードしてインストールしてみたら、、、
おぉ、ちゃんと表示されている!!
Entity Framework 対応の ODP.NET
調べ物をしていたら、ODP.NETの最新版が出ていることに今更ながら気づきました。
すっかり見逃していたんですが、.NET からOracleデータベースに接続するためのコンポーネント、Oracle Data Access Components(ODAC)の最新版 Release 4(11.2.0.3.0)がリリースされていました。1/5のInfoQでしっかり記事になっていたんですね(Oracleプロバイダは、EFをサポートした)。しかし12/28ってずいぶん年の瀬のリリースだったんですね。
OracleのEntity Frameworkサポートは.NET 3.5の時からずっと囁かれていたので、やっとという感じです。
このリリースの目玉は、なんといってもOracleでのEntity Frameworkへの対応です。今のところEntity Framework 4.1には未対応らしく、コードファーストなんかはサポートされていないので、ASP.NET MVCの最新機能を利用するっていうのは難しいけれど、OracleでLINQが実用レベルで利用できるっていうのは嬉しいですね。
ダウンロード
今のところ、OTN本家にしか置いていないのでダウンロードはここから。
32-bit Oracle Data Access Components (ODAC) with Oracle Developer Tools for Visual Studio
32-bit Oracle Data Access Components (ODAC) Downloads
64-bit Oracle Data Access Components (ODAC) Downloads
Visual Studioで使う場合は一番上を、実行環境ではそれぞれのOracle Clientのアーキテクチャー(32bit/64bit)にあわせてインストールしましょう。
ドキュメント
ドキュメントはこちら。こっちも日本語版はまだ整備されていないみたいなので、とりあえず英語版。
Oracle® Data Provider for .NET Developer’s Guide 11g Release 2 (11.2.0.3)
パフォーマンスカウンターでODP.NETのプーリング状態を確認しよう
.NETからOracleデータベースに接続する場合は、ODP.NET(Oracle Data Provider for .NET)を使うことがほとんどだと思います。ODP.NETも他のADO.NETのプロバイダーと同様コネクションプーリングなどの機能は標準でサポートされています。では、実際にプーリングが効いているかを確認するにはどうしたらいいでしょうか。
ODP.NETのコネクション状態を確認するには、ODP.NETのインストール時に自動的に追加されるWindowsのパフォーマンスカウンターを参照するのが簡単です。パフォーマンスカウンターの参照方法は、ODP.NETのマニュアルに詳しい解説があります。→ 接続プール・パフォーマンス・カウンタ
前々から存在自体は知っていたのですが、なぜか表示されないので諦めていましたが、ODP.NETのマニュアルにしっかり書いてありますね。レジストリーの値と構成ファイル(web.config|app.config)を変更して、有効にしてあげましょう。
レジストリーの変更
パフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプREG_SZのレジストリ値PerformanceCountersを使用します。このレジストリ値は次のようになります。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version
うちのPC(Windows7 64bit)の場合は、コッチみたい
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\ODP.NET\Assembly_Version
構成ファイルの変更
<configuration>
<oracle.dataaccess.client>
<settings>
<add name="PerformanceCounters" value="3"/>
</settings>
</oracle.dataaccess.client>
</configuration>
設定する値は、ODP.NETのマニュアルの表3-2に定義された値の合計です。マニュアルでは、HardConnectsPerSecond(1)
およびHardDisconnectsPerSecond(2)の値を採りたいので3が設定されています。すべての値を採りたい場合は、4095を指定すればいいでしょう。
両方に設定が行われていると、収集可能なインスタンスが表示されます。インスタンスはAppDomain単位で表示されるようなので、確認したいインスタンスを選択して追加ボタンをクリックしてカウンターを追加してあげましょう。
こんな風に表示されます。動きが少なくてあんまり面白くないですね。
Oracle で ASP.NET のパーソナライズを利用する。
ASP.NETではWebパーツの配置情報などをユーザーごとにパーソナライズする機能が備わっています。
パーソナライズのデータの保存には、通常SQLServerが利用されるのですが、Oracleでも同様の機能を利用することができます。
なにはともあれテーブルの準備
Oracleのセッションステートサーバーを利用した場合と同様に、ODT.NETをインストールすると、パーソナライズを行うためのテーブルやプロシージャの定義情報が、下記のフォルダーに格納されています。
%ORALCE_HOME%/ASPNET/SQL
今回は、パーソナライズ機能を利用したいので、次のSQLを実行します。すでにInstallAllOracleASPNETProviders.sqlなどを実行してテーブルやプロシージャが存在している場合はこの作業は不要です。
- InstallOracleASPNETCommon.sql
- InstallOraclePersonalization.sql
セッションステートサーバーを作成した場合と同様なのですが、上記のSQLから他のスクリプトを呼び出したりしているので、カレントディレクトリを移動してから実行する必要があるので注意しましょう。
SQLを実行すると、このあたりのテーブルが作成されるので確認して下さい。
参考:Oracle Providers for ASP.NETの個別構成
設定情報の変更
パーソナライズを行うには、確実にユーザーが誰であるかを確認し、ユーザーの情報をデータベースに保存する設定を行う必要があります。Web.configにOracleのパーソナライズプロバイダーの設定を追加しましょう。必要な項目は、次の3点です。
- フォーム認証の設定
- データベースへの接続情報設定
- 利用するパーソナライズプロバイダーの設定
<?xml version="1.0"?>
<configuration>
<!-- 接続文字列の設定 -->
<connectionStrings>
<add name="OracleAspNetConString" connectionString="****" />
</connectionStrings>
<system.web>
<!-- フォーム認証の設定 -->
<authentication mode="Forms">
<forms name="myAuth" loginUrl="~/Login.aspx" protection="All"
timeout="1440" slidingExpiration="true" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
<!-- パーソナライズプロバイダーの設定 -->
<webParts>
<personalization defaultProvider="myPersonalizationProvider">
<providers>
<add name="myPersonalizationProvider"
connectionStringName="OracleAspNetConString"
applicationName="myApp"
type="Oracle.Web.Personalization.OraclePersonalizationProvider,
Oracle.Web, Version=4.112.1.2,
Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</providers>
</personalization>
</webParts>
</system.web>
</configuration>
- personalization@defaultProvider でページでデフォルトで使用するプロバイダーを設定しておくと、WebPartManegerで毎回どのプロバイダーを利用するかを指定しなくていいので便利です。
まぁやることはないでしょうが、personalizationには複数のプロバイダーを設定できます。
OraclePersonalizationProviderがどのようなプロパティーを持っているのかは、OTNのヘルプで確認できます。
これだけやれば、後はSQLServerを使っている時とやることは同じです。
認証ページを作って、WebパーツマネージャーとWebパーツを配置してパーソナライズができます。
OracleのテーブルからVBのプロパティーを作る
かなり個人的なメモ
コメント欄に日本語名が入っていることが前提
SELECT ''''''' <summary> ' || CHR(13) || ''''''' ' || USER_COL_COMMENTS.COMMENTS || CHR(13) || ''''''' </summary> ' || CHR(13) || 'Public Property ' || USER_TAB_COLUMNS.COLUMN_NAME || ' As ' || case USER_TAB_COLUMNS.DATA_TYPE when 'CHAR' then 'String' when 'VARCHAR2' then 'String' when 'NUMBER' then case when USER_TAB_COLUMNS.DATA_PRECISION is null then 'Integer' else 'Double' end else 'String' end FROM USER_TAB_COLUMNS JOIN USER_COL_COMMENTS ON USER_TAB_COLUMNS.TABLE_NAME = USER_COL_COMMENTS.TABLE_NAME AND USER_TAB_COLUMNS.COLUMN_NAME = USER_COL_COMMENTS.COLUMN_NAME WHERE USER_TAB_COLUMNS.TABLE_NAME = 'テーブル名' ORDER BY COLUMN_ID