【C#】Oracleへの接続をクライアントインストール無しで行う

Oracle

※7月27日 追記 改めて書くまでも無いかもしれませんがC#での話として書いていますがVB.netも同様に可能なはずです
ローカルツールなどで作成するアプリでよくOracleへの接続をしなければいけない状況が多かったんですが
Oracleってバージョン違いの環境が構築出来なくて9iと11gを端末上で使いたいなど複数のバージョンを使用しないと行けない時に困りませんか?自分はよくその状況が発生して困っていました。
しかも、つい最近までOracleへの接続はクライアントのインストールをしないと出来ないと思っていました。
どのOracleクライアントのバージョンを使うかはPathによって決まるのでユーザで選択してもらうにはかなり辛い、ずっと解決方法が見つけられなくていたんですが最近ふとした時に検索したら解決方法がわかりました。

System.Data.OracleClientを使用する

この方法は最初から気が付いていましたが・・・
ODPを使用せずとも既存のSystem.Data.OracleClientを使用すれば確かに接続は可能なのですが
マイクロソフトの非推奨なので問題が発生する場合も考えられるので別の方法を探していました。

dotConnecter for Oracleを使用する

次に見つけたのはdotConnecter for Oracleを使用する方法
こちらは独自のdll単体でOracle接続可能となりEntityFrameworkも対応可能となるドライバーを提供してもらえます
ライセンス有料なので本当に可能なのかを知りたい場合には30日のProfessional Trialを使用してみる方法があります。

ODP.netを使用する

もう一つはなぜ気が付かなかったのかというところですがODP.netを単体でセットアップする方法です。
今までODP.netを動作端末に設定をする際にはインストーラを使用してOracleクライアントごと入れていましたがVisualStudioの場合にはNugetからDLL単体で入手が出来た事に気が付きました。
ツールからNugetマネージャを起動して検索ウィンドウに「ODP.NET Managed Driver」と入力して参照を追加すれば使用できます。
名前空間は「Oracle.ManagedDataAccess.*」です
後はインストーラを作成してアプリインストール時にODP.NET Managed Driverを一緒に配置してあげれば繋がります。
 
この記事を書いてる時に検索して気が付いたんですがOracle12cからこのドライバが追加されていてこのドライバを使用すればクライアントのインストールがいらなくなっていたんですね。なぜ今まで気が付かなかったんだろうと思っていましたが納得しました。
 
追記 サンプルに間違えがありましたので修正記事を書きました
https://programchan.com/archives/131
 

using System;
using System.Collections.Generic;
using System.Linq;
using Dapper;
using Oracle.ManagedDataAccess.Client;
namespace ODPSample
{
    /// <summary>
    /// ODP.NET Managed Driver Sample Program
    /// </summary>
    class Sample
    {
        /// <summary>
        /// Main
        /// </summary>
        static void Main(string[] args)
        {
            using( var Connection = new OracleConnection()){
                //ユーザ端末にはクライアントをインストールしないのでtnsnames.oraが存在しない
                //tnsnamesは直接指定する
                var DataSource = "mydb=" +
                                "(DESCRIPTION =" +
                                    "(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))" +
                                    "(CONNECT_DATA =" +
                                    "(SERVER = DEDICATED)" +
                                    "(SERVICE_NAME = mydb)" +
                                    ")" +
                                ")";
                Connection.ConnectionString = "User ID=SCOTT; Password=TIGER; Data Source=" + DataSource + ";";
                Connection.Open();
                //Dapperを使用してクエリ発行
                Connection.Query("SELECT hoge FROM fuga")
                          .ToList()
                          .ForEach(r => Console.WriteLine(String.Format("{0}", r.hogehoge)));
            }
            Console.ReadLine();
        }
    }
}

 

Follow me!