AWS RDS Oracle に C# ネイティブアプリから接続する
はじめに
RDSのOracleを使う機会があったので接続方法についてまとめます。
今回は Oracle Client をインストールしないミドルウェアで接続しました。
Windows Form アプリケーションを使用して確認をしています。
動作環境
VisualStudio2019
.NET Framework 4.6
RDS Oracle 11.2.0.4.v21
接続ミドルウェア (Windows)
https://www.oracle.com/technetwork/jp/content/0127-1330-db-middleware-297515-ja.pdf
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]
2. NetworkException (0x000030E2)
接続文字列に使用しているサービス名が間違っていました。
OracleInternal.Network.NetworkException (0x000030E2): ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
RDS → 設定 で表示されるインスタンスからサービス名が確認できます。
インスタンス内の「DB名」をサービス名に指定することで接続できました。