.net からOracle Autonomous Database接続 （Oracle.ManagedDataAccess）

#概要 
Oracle Autonomous Database Cloudは、クラウドにおける自律型データベースを提供しています。
.net からOracle Autonomous Database接続してみました。
(Oracle Autonomous Data WarehouseとOracle Autonomous Transaction Processing二種類ありますが、接続方法同じです。）


# 1 準備
## 1.1 Autonomous Transaction Processingデータベース作成 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/ca11107f-616c-23ea-4f59-ab93038744c7.png)

## 1.2 クライアントの資格証明(ウォレット)のダウンロード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/e82d36dc-7d6e-8d25-f954-c51903a4a610.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/6c331e39-758e-e1c7-291c-990ce5c2ae71.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/f62b857a-1698-0827-bdd6-54f91cd6de97.png)

Wallet_TEST1.zip を保存する。


# 2 接続テスト
## 2.1 Visual Studio 起動、Atptest1 を作成 (Windows　Form application)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/0e7e8f83-4985-a780-2a28-aeb4071dca42.png)

## 2.2 NugetからOracle.ManagedDataAccess最新版をインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/cb8af20e-1d95-ac31-ee69-e960846cd0c6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/9ffc7153-baa6-2fcc-51c8-696e5ac4f694.png)

※Oracle.ManagedDataAccessの最新版選択すべきと思われますが、バージョン12.1.24160419以降接続できること確認しました。

## 2.3 ウォレットファイル解凍
上記1.2 でダウンロードしたウォレットファイルをAtptest1のbinフォルダーに解凍
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/f5d38385-d3f8-be56-7cd4-38b056367730.png)

※任意のフォルダーに解凍して問題ないですが下記二点注意する必要がある
１．tnsnames.oraとsqlnet.oraをexeと同じフォルダーに保存する必要がある
２．sqlnet.oraのDIRECTORY部分解凍フォルダーに合わせて記述する必要がある


## 2.4 sqlnet.ora編集
上記2.3で解凍されたファイルの中のsqlnet.oraをに環境あわせてDIRECTORY部分を修正　（相対パス、絶対パス両方問題ない）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/805cd264-4717-99c0-b7a2-a07404410b85.png)

```
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="./")))
SSL_SERVER_DN_MATCH=yes
```

## 2.5 簡単なコードでOracle 接続動作確認
### 2.5.1 サンプルコード

```
    OracleConnection conn = new OracleConnection();
    conn.ConnectionString = "User Id=ADMIN;Password=*your password*;Data Source=test1_high";
    conn.Open();

    OracleCommand oraCmd = new OracleCommand("SELECT TABLE_NAME FROM ALL_TABLES", conn);
    OracleDataReader oraReader;
    oraReader = oraCmd.ExecuteReader();
    while (oraReader.Read())
    {
        Console.WriteLine(oraReader.GetString(0));
    }
    oraReader.Close();
    conn.Close();
```
Data Sourceの部分tnsnames.oraファイルを参照。

サービス名につきまして、下記引用したOracle 資料を参考
> 定義済みのサービス名は、Autonomous Transaction Processingのさまざまなレベルのパフォーマンスと同時実行性を提供します。
>
>    high: 高データベース・サービスは、システムがリソース圧迫(たとえば、CPUまたはIO)を受けているときに、このサービスを介して実行されるSQL文に最高レベルのリソースを提供します。このサービスで実行できる同時SQL文の数は、データベース内のCPUの数を増やし、CPUの数に応じて拡張します。
>
>    medium: 中規模データベース・サービスは、システムがリソース圧迫(たとえばCPUまたはIO)を受けているときに、このサービスを通じて実行されるSQL文に、より低いレベルのリソースを提供します。 このサービスで実行できる同時SQL文の数は、データベース内のCPUの数によって異なり、CPUの数に比例します。
>
>    low: 低データベース・サービスは、システムがリソース圧迫(例えば、CPUまたはIO)を受けているときに、このサービスを介して実行されるSQL文に、最低レベルのリソースを提供します。 このサービスで実行できる同時SQL文の数は、データベース内のCPUの数によって異なり、CPUの数に比例します。
>
>    parallel: パラレル・サービスは、パラレル実行を使用して自動的に実行されるが、同時実行SQL文の数が最も少ないため、このサービスを介して実行される各SQL文に高レベルのリソースを提供します。 バッチ・プロセスまたはレポート・ワークロードだけがこのサービスを使用することをお勧めします。



### 2.5.2 実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123679/c585dfe0-4cb4-09bc-d6eb-320f8b693ad3.png)

無事に接続できました！


#参考資料：
https://www.oracle.com/technetwork/topics/dotnet/tech-info/default-5032178.html
https://docs.oracle.com/cd/E83857_01/paas/atp-cloud/atpug/connect-predefined.html#GUID-9747539B-FD46-44F1-8FF8-F5AC650F15BE

# 2019/07/13追記
セキュリティの観点からClient直接Internet経由Autonomous Databaseへの接続したくない場合、下記のツールを使えばよりセキュア、よりhigh performanceを期待できます。
[Cdbc (Cloud Database Connectivity) ](https://cdbc.ricct.com/)
![Cdbc diagram](https://cdbc.ricct.com/img/cdbc1.png)

メリット：
Database portをInternet開放必要がない, Clientは443 port使用、複雑な設定不要
ウォレットを全クライアントに配布する必要がない
通信するパケットを圧縮できる
DBへの接続は一箇所集中管理できる