Grow up

生活とプログラミング

AWS RDS Oracle に C# ネイティブアプリから接続する

f:id:knkomko:20190815020721p:plain:w450

はじめに

RDSのOracleを使う機会があったので接続方法についてまとめます。
今回は Oracle Client をインストールしないミドルウェアで接続しました。
Windows Form アプリケーションを使用して確認をしています。

動作環境

VisualStudio2019
.NET Framework 4.6
RDS Oracle 11.2.0.4.v21

OLEDBを使用した接続 (不採用)

OLEDBを使用すると以下のようなエラーが表示されました。

System.InvalidOperationException: The 'OraOLEDB.Oracle' provider is not registered on the local machine.

OLEDBを使用した接続では Oracle Client のインストールが必要のようです。
stackoverflow.com

using System;
using System.Data;
using System.Windows.Forms;

using System.Data.OleDb;

namespace OracleSample
{
    public partial class Form1 : Form
    {
        private const string HostName = "hostName";
        private const string ServiceName = "serviceName";
        private const string UserName = "userName";
        private const string Password = "password";

        public Form1()
        {
            InitializeComponent();
        }

        // OLEDB ExecuteNonQuery
        private void Button3_Click(object sender, EventArgs e)
        {
            string sql = TxtBox1.Text;
            using (OleDbConnection connection = new OleDbConnection("Provider=OraOLEDB.Oracle;Data Source=" + ServiceName + ";User Id=" + UserName + ";Password = " + Password + ";OLEDB.NET=True"))
            {
                OleDbCommand command = new OleDbCommand(sql, connection);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
            }
        }
        // OLEDB Fill
        private void Button4_Click(object sender, EventArgs e)
        {
            DataTable dataTablee;
            string sql = TxtBox2.Text;
            using (OleDbConnection connection = new OleDbConnection("Provider=OraOLEDB.Oracle;Data Source=" + ServiceName + ";User Id=" + UserName + ";Password = " + Password + ";OLEDB.NET=True"))
            {
                OleDbCommand command = new OleDbCommand(sql, connection);
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);
                connection.Open();
                adapter.Fill(dataTable);
                connection.Close();
            }
            DataGridView001.DataSource = dataTable;
        }
    }
}
ODP.NET を使用した接続 (採用)

ODP.NET を使用することで Oracle Client のインストールが不要になります。

ODP.NET を使用するには以下のライセンスに同意する必要があります。
Oracle Technology Network Development and Distribution License Terms

NuGetにてdllをインストールして使用します。
https://www.nuget.org/packages/Oracle.ManagedDataAccess/

using System;
using System.Data;
using System.Windows.Forms;

using Oracle.ManagedDataAccess.Client; // ODP.NET Oracle managed provider

namespace OracleSample
{
    public partial class Form1 : Form
    {
        private const string HostName = "hostName";
        private const string ServiceName = "serviceName";
        private const string UserName = "userName";
        private const string Password = "password";
        private string connectstring = "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = " + HostName + ")(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = " + ServiceName + "))); User Id = " + UserName + "; Password = " + Password + ";Connection Timeout = 1500;";

        public Form1()
        {
            InitializeComponent();
        }

        // ODP.NET ExecuteNonQuery
        private void Button1_Click(object sender, EventArgs e)
        {
            string sql = TxtBox1.Text;
            using (OracleConnection connection = new OracleConnection(connectstring))
            {
                OracleCommand command = new OracleCommand(sql, connection);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
            }
        }
        // ODP.NET Fill
        private void Button2_Click(object sender, EventArgs e)
        {
            DataTable dataTable;
            string sql = TxtBox2.Text;
            using (OracleConnection connection = new OracleConnection(connectstring))
            {
                OracleCommand command = new OracleCommand(sql, connection);
                OracleDataAdapter adapter = new OracleDataAdapter(command);
                connection.Open();
                adapter.Fill(dataTable);
                connection.Close();
            }

            DataGridView001.DataSource = dataTable;
        }
    }
}
遭遇したエラー

1.SocketException (0x80004005)
ファイアウォールやネットワーク設定が原因の可能性があります。
私の場合はRDSのポートを開放することで解決できました。

System.Net.Sockets.SocketException (0x80004005): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond [IP address]

forums.asp.net

2. NetworkException (0x000030E2)
接続文字列に使用しているサービス名が間違っていました。

OracleInternal.Network.NetworkException (0x000030E2): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

stackoverflow.com

RDS → 設定 で表示されるインスタンスからサービス名が確認できます。
インスタンス内の「DB名」をサービス名に指定することで接続できました。
f:id:knkomko:20190814144517p:plain:w350