1. monta31538

    Posted

    monta31538
Changes in title
+Managed な ODP.NET で tnsnames.ora を参照する (Windows, Visual Studio 2015)
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,86 @@
+# Managed な ODP.NET で tnsnames.ora を参照する (Windows, Visual Studio 2015)
+
+開発 PC の Visual Studio に ODP.NET 管理対象ドライバを Nuget で導入した場合、リモートのデータソース情報を定義した tnsnames.ora を探してくれなかった。
+
+調べたことを備忘録として記録する。
+
+## 問題
+
+.NET Framework 4 向けのドライバを Visual Studio に Nuget で導入する。
+
+```
+PM> install-package Oracle.ManagedDataAccess
+'.NETFramework,Version=v4.6.1' を対象とするプロジェクト 'Odp64Sample' に関して、パッケージ 'Oracle.ManagedDataAccess.12.1.24160719' の依存関係情報の収集を試行しています
+DependencyBehavior 'Lowest' でパッケージ 'Oracle.ManagedDataAccess.12.1.24160719' の依存関係の解決を試行しています
+パッケージ 'Oracle.ManagedDataAccess.12.1.24160719' をインストールするアクションを解決しています
+パッケージ 'Oracle.ManagedDataAccess.12.1.24160719' をインストールするアクションが解決されました
+パッケージ 'Oracle.ManagedDataAccess.12.1.24160719' をフォルダー 'C:\Users\xxx\documents\visual studio 2015\Projects\Odp64Sample\packages' に追加しています
+パッケージ 'Oracle.ManagedDataAccess.12.1.24160719' をフォルダー 'C:\Users\xxx\documents\visual studio 2015\Projects\Odp64Sample\packages' に追加しました
+パッケージ 'Oracle.ManagedDataAccess.12.1.24160719' を 'packages.config' に追加しました
+'Oracle.ManagedDataAccess 12.1.24160719' が Odp64Sample に正常にインストールされました
+```
+
+アクセスする Oracle Database はリモートの 11g で、クライアントとなる開発 PC には、.NET Framework 2.0 向けの ODP.NET ドライバを使用するアプリを開発していたときの tnsnames.ora は導入されている。
+
+この環境状の Visual Studio 2015、.NET Framework 4.6.1、VB.NET で、接続するだけのサンプルを動かすと、データソースが解決できずに `conn.Open` が失敗する。
+
+```vbnet
+Using conn = New OracleConnection("user id=scott;password=tiger;data source=xxx")
+ Try
+ conn.Open()
+ MessageBox.Show("データベースに接続しました。")
+
+ Catch ex As Exception
+ MessageBox.Show(ex.Message)
+ End Try
+End Using
+```
+
+## 調べた内容
+
+[Oracle® Data Provider for .NET開発者ガイド 12c リリース1 (12.1.0.1) Oracle Data Provider for .NETの構成](https://docs.oracle.com/cd/E49329_01/win.121/b72971/featConfig.htm)
+
+の `dataSourcesセクション` は次のように説明している。
+
+> 接続文字列のData Source属性で指定したデータソース・エイリアスは、次の優先順序で解決されます。
+- .NET構成ファイルの<oracle.manageddataaccess.client>セクションにあるdataSourcesセクション内のデータソース・エイリアス。
+- .NET構成ファイルのTNS_ADMINで指定した場所にあるtnsnames.oraファイル内のデータソース・エイリアス。
+- .exeと同じディレクトリにあるtnsnames.oraファイル内のデータソース・エイリアス。
+
+つまり、アプリから接続文字列で指定したデータソースの実体を解決するには、次のいずれかが必要になる。
+
+1. app.config (web.config?) の `dataSource` 要素に tnsnames.ora のデータソース定義と同じ内容を指定する。
+2. app.config (web.config?) の `setting` 要素に、tnsnames.ora の置き場所を指定する。
+3. tnsnames.ora を exe ファイルと同じフォルダに置く。
+
+Nuget で `Oracle.ManagedDataAccess` をインストールすると、app.config に要素 `<oracle.manageddataaccess.client>` が追加されている。これに上記 2. の `setting` 要素を書いてみると以下のようになる。
+
+```xml
+<oracle.manageddataaccess.client>
+ <version number="*">
+ <settings> <!-- 2. の指定 -->
+ <setting name="TNS_ADMIN" value="%ORACLE_HOME%/network/admin" />
+ </settings>
+ <dataSources> <!-- 1. の指定 -->
+ <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/>
+ </dataSources>
+ </version>
+</oracle.manageddataaccess.client>
+```
+
+クライアントアプリケーションの接続文字列には `SampleDataSource` を指定すると接続できるようになった。 3. は未確認。
+
+
+## 参考
+
+同文書、同項には、次の記述もあるのでクライアント PC に ODP.NET をインストールして回るなら、本開発環境の問題は発生しないと考えられる。
+
+>ODP.NET管理対象ドライバとOracleホームを一緒にインストールすると、TNS_ADMIN設定が自動的に.NET Frameworkのmachine.configファイル内に作成されます。TNS_ADMIN設定はディレクトリ<ORACLE_HOME>\Network\Admin\となるように設定され、ここがデフォルトのマシンの場所となってtnsnames.ora、sqlnet.oraおよびldap.oraの各ファイルがホスティングされます。
+
+
+
+## 確認した環境
+
+- 日本語 Windows 10 64 ビット
+- Visual Studio 2015 Community
+- Oracle.ManagedDataAccess {12.1.24160719}