アーカイブ

Archive for the ‘Oracle’ Category

Oracle Data Provider for .NET 12.1のODP.NET管理対象ドライバ

2013年11月13日 1件のコメント

手違いで記事が消えてしまったので、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

この中で気になったのが、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を同じフォルダーに入れてあげます。

無題2

動きました。

image

関連ドキュメント

OracleClientをインストールしなくても動くのはいいですね。ただ、Oracle.DataAccess.Clientとは差異がアルようなのでODP.NET管理対象ドライバを利用する場合は、このあたりのドキュメントに目を通しておいたほうがいいでしょう。

えっ!!ODP.NETをNugetでインストール!?

2013年1月21日 コメントを残す

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)

image

ODACをインストールすると、Nugetのパッケージフォルダーに関係するODP.NETも同時にインストールされます。インストールされたフォルダーを見ると、インストールされたのはDLLが8個だけ、、、えっこれだけで動作するはずが、、、

image

実行してみる。。。

とりあえず、超シンプルなコードを書いて実行してみる。。。。あれ?

image

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のテーブルに対してクエリーを発行する。

2012年11月15日 コメントを残す

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ウインドウからダウンロードしてインストールすることができます。

imageimage

ここでは他にも下記のドラーバーをインストールすることができます。

  • 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)を選択します。

image

続けてRDBMSの接続方法を定義します。今回はクライアント側にOracleクライアントがインストール済みなのでOCIを選択しました(簡易TNSって楽でいいですねー)。Oracle Clientがインストールされていない環境用にDirect接続もできるようですが、AdvancedタブでSIDやもろもろを設定しても上手くつながりませんでした。

テーブル名を複数形にする必要は無いので、Pluralize EntitySet and table propertiesはOFF、テーブル名のアンダーバーを削ったり短くしたりする必要もないのでCapitalize Property NamesもOFFでデータソースを定義します。

image

クエリーを実行してみる。

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"))

image

でました。

大文字、小文字無視で。
KARUATEST.Where(user => 
user.NAME.StartsWith("karua", StringComparison.InvariantCultureIgnoreCase))
image
あれ?結果が変わりませんね。SQLタブを見てみると。
SELECT t0.ID, t0.NAME
FROM KARUATEST t0
WHERE (t0.NAME LIKE :p0 || '%')

うーん、StringComparison.InvariantCultureIgnoreCaseを考慮してくれないようです。
こうかな?
KARUATEST.Where(user => user.
NAME.ToUpper().StartsWith("karua".ToUpper()))

image
上手く出ました。このあたりの解釈は、IQueryableのドライバーによって変わってきますね。
SQLを見てみるとこんな感じに展開されています。
SELECT t0.ID, t0.NAMEFROM KARUATEST t0
 WHERE (UPPER(t0.NAME) LIKE :p0 || '%')

もちろんこのクエリーだとカラム側にUPPER関数が実行されるので、関数インデックスがない場合はSQL的によろしくないですが、まぁとりあえずいいでしょう。パラメーター側はちゃんと.NET側で大文字にしてからバインド変数に渡していますね。

まとめ

実際の動作は各LINQプロバイダーによって動作が変わってくるので、実際の動作は動作環境に合わせてプログラム側で確認する必要があります。場合によっては、IQ側ではサポートされているけれど、ODP.NET側ではサポートされていないってことがあり得る。

もちろん実際のプログラムにでもIQToolkitを使ってプログラミングしてあげればいいんでしょうが、そうも言えないと思うので、LINQ Padでの確認は、こんな文法で行けるかなってのをなんとなく確認するという感じにとどめたほうがいいでしょう。

カテゴリー:プログラミング, メモ, Oracle タグ:

Oracle SQL Developer 3.1.07.42でオブジェクトの一覧が表示されないのが治った。

2012年2月15日 コメントを残す

Windowsのドメインサーバーを変更したタイミングで、Oracle SQL Developer(3.0.04)でこんなエラーが表示されて、テーブルの一覧やViewの一覧などが表示されなくなってしまいました。Javaのランタイム有り・無しとか、32Bit版でインストールしてみたりとかやっても、全く変わらずだったので、すっかり諦めていました。

o.d.db.DBUtil(oracle.dbtools.db.DBUtil) 警告、未処理例外:クローズされた例外です。

image

 

同僚のN君から、SQL Developerの最新版が出たよーと教えてもらったので、早速ここからダウンロードしてインストールしてみたら、、、

image

おぉ、ちゃんと表示されている!!

カテゴリー:Oracle タグ:

Entity Framework 対応の ODP.NET

2012年1月12日 1件のコメント

調べ物をしていたら、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)

カテゴリー:ASP.NET, Oracle タグ:

パフォーマンスカウンターでODP.NETのプーリング状態を確認しよう

2011年11月22日 2件のコメント

.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単位で表示されるようなので、確認したいインスタンスを選択して追加ボタンをクリックしてカウンターを追加してあげましょう。

image

こんな風に表示されます。動きが少なくてあんまり面白くないですね。

image

Oracle で ASP.NET のパーソナライズを利用する。

2011年2月28日 1件のコメント

ASP.NETではWebパーツの配置情報などをユーザーごとにパーソナライズする機能が備わっています。

パーソナライズのデータの保存には、通常SQLServerが利用されるのですが、Oracleでも同様の機能を利用することができます。

なにはともあれテーブルの準備

Oracleのセッションステートサーバーを利用した場合と同様に、ODT.NETをインストールすると、パーソナライズを行うためのテーブルやプロシージャの定義情報が、下記のフォルダーに格納されています。

%ORALCE_HOME%/ASPNET/SQL

今回は、パーソナライズ機能を利用したいので、次のSQLを実行します。すでにInstallAllOracleASPNETProviders.sqlなどを実行してテーブルやプロシージャが存在している場合はこの作業は不要です。

  • InstallOracleASPNETCommon.sql
  • InstallOraclePersonalization.sql

セッションステートサーバーを作成した場合と同様なのですが、上記のSQLから他のスクリプトを呼び出したりしているので、カレントディレクトリを移動してから実行する必要があるので注意しましょう。

SQLを実行すると、このあたりのテーブルが作成されるので確認して下さい。

image

参考: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パーツを配置してパーソナライズができます。

カテゴリー:ASP.NET, Oracle タグ:

OracleのテーブルからVBのプロパティーを作る

2011年1月18日 コメントを残す

かなり個人的なメモ

コメント欄に日本語名が入っていることが前提

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
カテゴリー:プログラミング, Oracle タグ: