Archive

Posts Tagged ‘Oracle’

OraOps12.dllが見つからないと思ったら、MSVCR100.dllがなかった

Oracleに接続するWebサーバーを改めて構築しているわけですが、Oracleクライアントを入れるのもめんどくさい。ただ、これまでのしがらみがあってマネージドドライバーが使えないため、インスタントクライアントを利用することにしました。

いざデプロイしたサイトを実行すると、OraOps12.dllがないエラーでしばらくはまったのでメモ。

ODACをダウンロード

現在の最新版をOTNからダウンロード(現在は12.1.0.2.1)して、C:\install\odacあたりに解凍します。

http://www.oracle.com/us/products/tools/index-090165.html

インスタントクライアントのセットアップ

解凍したODACのフォルダーに移動して、allでinstant Clientをセットアップします。

cd C:\install\odac

install.bat all c:\oracle myorahome true

環境変数の設定

必要な環境変数を設定します。NLS_LANGは環境に合わせて。

  環境変数名 設定値 備考
1 PATH c:\oracle/bin;c:\oracle binを先にする?
2 NLS_LANG JAPANESE_JAPAN.JA16SJISTILDE 必要な場合

動作確認

Webアプリケーションをデプロイして動かしたらこうなった。

System.TypeInitializationException: ‘Oracle.DataAccess.Client.OracleConnection’ のタイプ初期化子が例外をスローしました。
—> System.DllNotFoundException: DLL ‘OraOps12.dll’ を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E)
場所 Oracle.DataAccess.Client.OpsInit.CheckVersionCompatibility(String version)
場所 Oracle.DataAccess.Client.OracleInit.Initialize()
場所 Oracle.DataAccess.Client.OracleConnection..cctor()

— 内部例外スタック トレースの終わり —
場所 Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
場所 LoginProcess.Load(String domain)
場所 Login.Page_Load(Object sender, EventArgs e)
場所 System.Web.UI.Control.LoadRecursive()
場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)()

調査中

しょうがないのでConsoleApplicationでDUAL表を検索するおなじみのサンプルを作る。ん?

image

コンピューターに MSVCR100.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。

Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)のインストール

ダウンロードセンターからダウンロードしてインストールします。

http://www.microsoft.com/ja-jp/download/details.aspx?id=14632

 

無事動きました。

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

OracleオフィシャルのNuget版ODP.NET

2015年2月6日 1件のコメント

OracleオフィシャルのNuget版ODP.NETがいつのまにやらリリースされていました。

Visual StudioのNuget パッケージ管理から検索するといろいろ引っかかって紛らわしいですが、Offical版のパッケージ名は、Oracle.ManagedDataAccessになったようです。

PM> Install-Package Oracle.ManagedDataAccess

image

まだ出始めなので、UnOfficalな子達のほうが上位に上がってきていますが、12cのアイコンが有る奴がOffical版ですね。

image

インストールするとOracle.ManagedDataAccessが参照に加えられ、app.config/web.configにいくつかの修正が加えられます。あとはこれまでのコーディングと同じくプログラミングすればいいはずです。そういえば、DTCのDLLはどうなるんだ?

image

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

Oracle 12cクライアントからOracle 9iには接続できない

前回のエントリーで、PCにODAC 12cを追加インストールしたら、「ORA-03134」が発生してOracle 9iデータベースに接続できなくなってしまいました。Oracle 12c ClientからはOracle 10g R1以前のOracleサーバーに接続できないようです。

Oracle「Oracle Client / Server Interoperability Support」にはまだOracle Client 12.2の記載はありませんが、Oracle Client 12.1.0からOracle Server 10.1以下への接続はNoとなっており接続できない(サポートしないではない)となっています。

困ったことに9iクライアントからは12cに接続できないため、9iと12cに接続する端末には11gや10g R2のOracle Clientを使ってやるか、要件を満たせるのであれば復数のOracle Clientをインストールして切り替えるようにします。

カテゴリー:Oracle タグ:

ODAC 12c Relase 3がリリース。Nuget版ODP.NETはもう少し後

Oracle Open World 2014で発表になった機能を実装し、ODAC12c Relase 3が正式リリースされたようです。ただし、このリリースと同時期に提供予定だったNugetの提供はもう少し後になるようです。

関連リソース

32-bit Oracle Data Access Components (ODAC) with Oracle Developer Tools for Visual Studio

http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html

Oracle Database Data Access Components Documentation 12c Release 3 (12.1.0.2.1)

http://docs.oracle.com/cd/E56485_01/index.htm

既存のODT.NETのVisual Studioごとの共存が可能に?

インストールの途中にこのODT.NET(Visual Studioの拡張)をインストール済みのどのVisual Studioに適用するかという選択と、ODP.NETをマシンワイドレベルで構成するかという選択が可能になっていました。これまでのODT.NETは単一バージョンのみサポートされていましたが、今回のバージョンからはVisual Studioのバージョンごとに複数バージョンのODT.NETのインストールが可能になっているようです。

image

左はVisual Studio 2010+ODTwithODAC112012、右はVisual Studio 2013+ODTwithODAC121021

ODT.NETをマシンワイドレベルで構成しない場合、下記のダイアログの説明の通り、machine.configへの登録やGACへの登録が行われないのでアプリケーションで新しいバージョンのODP.NETを利用する場合web.configやapp.configへプロバイダの登録が必要になります(直にDLLを参照する場合はなくても動く)。

image

インストール後にmachine.configのsystem.dataセクションをみると、Oracle Data Provider for .NETのプロバイダー設定が以前のまま保持されていることを確認できます。既存のアプリケーションは以前のバージョンで開発したい場合などに便利ですね。

<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=4.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342" />

    … 略 …
  </DbProviderFactories>
</system.data>

直にDLLを参照するようなアプリケーションを作成する場合は、参照先に注意

マシンワイドレベルで構成しない場合、たしかに既存アプリケーションの参照は以前のものを利用しているようですが、Visual Studioのアセンブリの参照ダイアログからOracle.DataAccess.Clientを選択しようとすると、新しいバージョンしか出てこないので、以前のアセンブリを参照したい場合は参照ボタンからじかにDLLを選択する必要がありそうです。間違って新しいバージョンを参照してアプリを作ってしまうと実行環境で動かないとかいうことも…

image

#これでやっとスキーマ比較を自分の普段使っているPCでも使えるようになった。

カテゴリー:Oracle, Visual Studio, 未分類 タグ: ,

Oracle Database 12cではパッケージ仕様部で定義したコレクション型をパッケージ実装部のSQLで利用することができるみたい。

これまでPL/SQLの内部でSQLを発行するときにIN句に引数の値を利用するには、グローバルな型としてTYPE宣言した方の変数を引数としてもらい、表関数(TABLE)を使ってコレクションのネストを解除して問い合わせを行う必要がありました。

12cでもネストの解除を行う必要が有りますが、パッケージ仕様部で定義したコレクション型をSQLで利用できるようになったようです。

Oracleのマニュアルでは、新機能ガイドでこそっと紹介されています。

Oracle Database 12c 新機能ガイド
2.1.4.12 PL/SQLからSQLへのインタフェースで使用できるPL/SQL固有のデータ型

データ型がPL/SQLで宣言されたコレクションに対するPL/SQLプログラムで表演算子を使用できるようになりました。このとき、データ型としてPL/SQL結合配列を使用することもできます。(以前のリリースでは、コレクションのデータ型をスキーマ・レベルで宣言する必要がありました。)

詳しくはOracle® Database PL/SQL言語リファレンスを参照してくださいということですので、該当の記述があるOracle Database 12cリリース1(12.1)の変更点PL/SQLとSQL間のインタフェースを越えられるPL/SQL専用データ型の追加を参照してください。

例えばこんなパッケージ定義が有るとします。Test2.Sample1は引数にもらったコレクションを元にtestTableテーブルのId列をIn句で検索してヒットした件数を返します。

create or replace package Test2
as

type SampleArrayType is table of char(5);

function Sample1(arr SampleArrayType) return number;

end test2;

create or replace package body Test2
as

function Sample1(arr SampleArrayType) return number
is
   rowCount number(3);
begin
   select count(*) into rowCount
     from testTable
    where id in (select column_value from TABLE(arr));

   return rowCount ;
end Sample1;

end test2;

このSQLを次のような無名ブロックで実行します。

DECLARE
  ARR TEST2.SAMPLEARRAYTYPE := TEST2.SAMPLEARRAYTYPE(‘123’, ‘456’);
  v_Return NUMBER;
BEGIN
  v_Return := TEST2.SAMPLE1(
    ARR => ARR
  );
  DBMS_OUTPUT.PUT_LINE(‘v_Return = ‘ || v_Return);
END;

上記の無名ブロックは12cで実行すると期待通り実行できますが、11gでは下記のようなエラーメッセージが表示され実行できません。12c以前でIn句にコレクションを利用したい場合は、パッケージ仕様部ではなくスキーマのオブジェクトとして配列をTYPE宣言して上げれば同じ結果が得られます。

Error
[row:28,col:1] ORA-21700: オブジェクトが存在しないか、削除マークが設定されています。
ORA-06512: "XXXXX.TEST2", 行9
ORA-06512: 行5

なにげに嬉しいです。

カテゴリー:Oracle タグ: ,

ODP.NETもNugetで簡単接続

2015/02/06追記

OracleオフィシャルのNuGetパッケージが出ています。できるだけこちらを使用してください。

OracleオフィシャルのNuget版ODP.NET

 

Oracle Open World 2014のPPTを見ていて気づいたんですが、ODP.NET(マネージド版)はNugetで配布されているんですね!!非マネージド版は相変わらずOracleClientを必要とするので最低でもInstantClientのXCOPYデプロイが必要になります。(管理対象とか、非管理対象とか日本語に訳さないようがいいような気がする。)

https://www.nuget.org/packages/odp.net.managed/121.1.2

image

まぁ実際に開発で使う場合にはODT.NETのサポートも受けたほうが効率がいいので、おそらくOTNからODT.NETをダウンロードしてインストールしますが、Oracleクライアントをインストールしていない端末でも簡単にOracleに接続するプログラムを構築できるようになったのは大きいです。

これまでODT.NETは復数バージョンのインストールが難しかったのでNugetを使うことでプロジェクト内でDLLのバージョンが閉じてくれるのは嬉しいですね。また、ビルドサーバーなんかでは復数のプロジェクトをホストするはずなのでOracleClientをいくつも入れなくていいのも嬉しい限り。Visual Studio OnlineなんかみたいにOracleClientをインストール出来ない環境もありますし。

この他にもODP.NETの次期バージョンではEF6+CodeFirstがサポートされるようなのでこちらにも期待です。Oracle Open WorldのWindows/.NET関連のセッション一覧とスライドはここから確認できます。

.NET Development/Oracle Database on Windows

あとはこいつがPCL化してくれればストアアプリやスマートフォンからも。。。って、もちろんしますよね。Oracleさん!!

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

ODT.NET 12.1.0.1.2のスキーマ比較はUIからのみ実行でき、対象はDBスキーマのみ

昨日の記事でODT.NETの12.1.0.1.2ではスキーマ比較ができるようになったってエントリーを書いたんですが、その後データベースプロジェクトとの比較と自動ビルドからのスキーマ比較を調べていたら、どうも今回のリリースは制限リリースで、データベースのスキーマ同士以外のスキーマ比較は対応していなそうです。

ODT.NETをインストールしたORACLE_HOMEにあるODACDocフォルダーにあるODTのreadmeのKnown Issuesを見るとこんな記述がありました。

image

Oracle Open World の.NET関連のスライドにある、ALM with Visual Studio: SQL and PL/SQL Development, Source Control, and Deploymentのスライド(45ページあたり)を見ても、データベースどうしの比較についてのみ触れられているので、このリリースに関してはデータベースプロジェクトとの比較はできないようです。また、当然ながらTFSの自動ビルドと組み合わせて自動配置ってのも難しそう。

うーん、今のところってことなんだよね??(希望)。

カテゴリー:Oracle, Visual Studio タグ: