.NET アプリでデータベースに接続する

# はじめに

データベースに接続する Windows アプリを仕事で作っています。とはいえ作成済のプログラムを修正しているだけで、新規作成することがありません。データベースに接続するプログラムの作り方を確認しておきたいと思いました。

以下の環境で開発および動作を確認します。
* Windows 11 
* Visual Studio 2022
* .NET Framework 4.5.2 および .NET 8.0

# Microsoft SQL Server に接続する

Microsoft SQL Server に接続する .NET アプリを作成してみます。

## Microsoft SQL Server を用意する

データベースサーバを導入するマシンを用意します。

Microsoft SQL Server は Windows および Linux で動作する製品があります。
通常はサーバ機＋Windows Server を使いますが、クライアント用パソコン＋Windows 11 でも動作します。

Microsoft SQL Server を導入します。今回は無償版を使います。

[SQL Server Express（無料版）を導入する #SQLServer - Qiita](https://qiita.com/shironana/items/c98e38bc85c6f5a9bd3c)

自分は「インスタンスの構成」で「名前つきインスタンス」でなく「規定のインスタンス」を選択します。
「認証モード」は「混合モード」を選択して「システム管理者（sa）アカウントのパスワード」を指定しておきます。

加えて、管理ツールである SQL Server Management Studio を導入します。

[SQL Server Management Studioのインストールと簡単な使い方 | IT職種コラム](https://it-kyujin.jp/article/detail/785/)

さらに、サンプルデータを導入しておきましょう。

[SQL Server:サンプルデータベース「Northwind」を作成する方法 | SE Life Log](https://selifelog.com/blog-entry-2092.html)

データベースサーバを動作するコンピュータと、それに接続するアプリを動作するコンピュータは、通常は別々です。
SQL Server をインストールした直後は、別のコンピュータから接続できるようになっていません。設定を変更します。

[SQL Serverに外部から接続する備忘録 - 沙羅.com](https://sara.jiin.com/other/sql.html)

## .NET Framework＋System.Data.SqlClient で接続する

まず、.NET Framework アプリを作って SQL Server に接続してみます。

参考：[C#でDBに接続する方法(SQL Server) #SQLServer - Qiita](https://qiita.com/homan05872/items/787909b297f150a4d22e)

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ (.NET Framework）」を選択します。
フレームワークは `.NET Framework 4.5.2` を選択します。

以下のコードを実行してみます。

```csharp
using System.Data.SqlClient;
            
string conStr = "Data Source=127.0.0.1; User ID=sa; Password=......; Initial Catalog=Northwind;";

try
{
    using (SqlConnection cn = new SqlConnection())
    {
        cn.ConnectionString = conStr;
        cn.Open();
        Console.WriteLine("Connected.");
    }
}
catch (Exception ex) {
    Console.WriteLine("Error: " + ex.Message);
}
Console.ReadKey();
```

`ConnectionString` にセットする文字列は、接続したいデータベースに合わせて記述します。

[接続文字列とは？～書き方を解説（ADOでデータベース接続） | 工場エンジニアのAccessスキル](https://access-skill.com/ado-connectionstring/)

`Data Source` は、事前に準備した SQL Server を指定します。
`User ID` および `Password` に、予め指定したアカウントとパスワードを指定します。今回は管理者 `sa` を使っています。
`Initial Catalog` は、接続して操作するデータ領域です。

ここで使用している `System.Data.SqlClient` は、.NET Framework に用意されている SQL Server に接続するためのライブラリです。`System.Data` のバージョン 4.0.0 でした。

## .NET＋System.Data.SqlClient で接続する

続いて、.NET アプリを作って SQL Server に接続してみます。

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ」を選択します。
フレームワークは `.NET 8.0` を選択します。

上記と同じコードを実行してみます。
するとビルドに失敗しました。
`System.Data.SqlClient` は `.NET` に用意されていないのです。

Visual Studio の「Nuget パッケージの管理」を開いて `Data.System.SqlClient` をインストールします。バージョン 4.8.6 でした。

上記と同じコードを実行してみます。

## .NET Framework＋Microsoft.Data.SqlClient で接続する

`System.Data.SqlClient` は以前から使えるライブラリですが、2019 年から新たに `Microsoft.Data.SqlClient` が用意されていました。

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ (.NET Framework）」を選択します。
フレームワークは `.NET Framework 4.6.2` を選択します。4.5.2 では `Microsoft.Data.SqlClient` をインストールできませんでした。

Visual Studio の「Nuget パッケージの管理」を開いて `Microsoft.Data.SqlClient` をインストールします。バージョン 5.2.2 でした。

以下のコードを実行してみます。

```csharp
using Microsoft.Data.SqlClient;
            
string conStr = "Data Source=127.0.0.1; User ID=sa; Password=......; Initial Catalog=Northwind;";

try
{
    using (SqlConnection cn = new SqlConnection())
    {
        cn.ConnectionString = conStr;
        cn.Open();
以下略
```

実行時にエラー発生しました。

```
Error: サーバーとの接続を正常に確立しましたが、ログイン中にエラーが発生しました。 (provider: SSL プロバイダー, error: 0 - 信頼されていない機関によって証明書チェーンが発行されました。)
```

`System.Data.SqlClient` と違って `Microsoft.Data.SqlClient` は暗号化オプションが有効になっているようです。

参考：[Microsoft.Data.SqlClient 4.0 以降で SQL Server に接続する際の暗号化オプション at SE の雑記](https://blog.engineer-memo.com/2022/08/31/microsoft-data-sqlclient-4-0-%E4%BB%A5%E9%99%8D%E3%81%A7-sql-server-%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7/)

接続文字列に `Encrypt=false` を加えます。

```
string conStr = "Data Source=127.0.0.1; User ID=sa; Password=......; Encrypt=false; Initial Catalog=Northwind;";
```

参考：[SQLサーバーへのアクセスで証明書のエラーが出る場合の対処法（信頼されていない機関によって証明書チェーンが発行されましたというエラー）](https://tech.tinybetter.com/Article/7b5d05c8-de00-2985-ebb7-3a00e1e23073/View)

## .NET＋Microsoft.Data.SqlClient で接続する

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ」を選択します。
フレームワークは `.NET 8.0` を選択します。

Visual Studio の「Nuget パッケージの管理」を開いて `Microsoft.Data.SqlClient` をインストールします。

上記と同じコードを実行してみます。

# MySQL データベースに接続する

続いて、MySQL データベースに接続する .NET アプリを作成してみます。

## MySQL データベースを用意する

データベースサーバを導入するマシンを用意します。

MySQL データベースは Windows 、Linux  、Solaris 、macOS で動作する製品があります。
通常はサーバ機＋サーバ OS を使いますが、クライアント用パソコン＋Windows 11 でも動作します。

MySQL データベースを導入します。今回は無償版を使います。

[WindowsにMySQLをインストールする #環境構築 - Qiita](https://qiita.com/aki_number16/items/bff7aab79fb8c9657b62)

「システム管理者（root）アカウントのパスワード」を指定しておきます。

加えて、管理ツールである MySQL Workbench を導入します。

[MySQL Workbenchのインストールとサーバー接続・DB管理](https://zenn.dev/masumi_s/articles/a64451d79cc9af)

さらに、サンプルデータを導入しておきましょう。

[MySQLのサンプルデータベース一覧 #MySQL - Qiita](https://qiita.com/pea1205/items/56e6c82df8de08a65677)

データベースサーバを動作するコンピュータと、それに接続するアプリを動作するコンピュータは、通常は別々です。
MySQL データベースをインストールした直後は、別のコンピュータから接続できるようになっていません。設定を変更します。

[MySQLを外部パソコンから接続する方法 | 合同会社ウェブライト](https://weblight.jp/mysql-connect/)

## .NET Framework＋MySql.Data.MySqlClient で接続する

まず、.NET Framework アプリを作って MySQL データベースに接続してみます。

参考：[.NET アプリケーションから MySQL へ接続する方法 - Microsoft.NET - Project Group](https://www.projectgroup.info/tips/Microsoft.NET/comm_0028.html)

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ (.NET Framework）」を選択します。
フレームワークは `.NET Framework 4.5.2` を選択します。

`System.Data.SqlClient` と違って、MySQL データベースに接続するライブラリは、.NET Framework に含まれていません。
そこで、MySQL のウェブサイトから接続用ライブラリを入手します。`MySQL Connector/NET` です。

その上で、プロジェクトの「参照」に `MySql.Data` を追加します。

以下のコードを実行してみます。

```csharp
using MySql.Data.MySqlClient;
            
string conStr = "Server=127.0.0.1; Uid=root; Pwd=......; Database=sakila;";

try
{
    using (MySqlConnection cn = new MySqlConnection())
    {
        cn.ConnectionString = conStr;
        cn.Open();
        Console.WriteLine("Connected.");
    }
}
catch (Exception ex) {
    Console.WriteLine("Error: " + ex.Message);
}
Console.ReadKey();
```

`ConnectionString` にセットする文字列は、接続したいデータベースに合わせて記述します。

参考：[【C#】MySQLに接続して直接SQLを実行する | hiranote](https://hirahira.blog/csharp-mysql-connect/)

`Server` は、事前に準備した MySQL データベースを指定します。
`Uid` および `Pwd` に、予め指定したアカウントとパスワードを指定します。今回は管理者 `root` を使っています。
`Database` は、接続して操作するデータ領域です。

## .NET＋MySql.Data.MySqlClient で接続する

続いて、.NET アプリを作って MySQL データベースに接続してみます。

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ」を選択します。
フレームワークは `.NET 8.0` を選択します。

上記と同様に `MySQL Connector/NET` の `MySql.Data` を参照に追加します。

上記と同じコードを実行してみます。
すると実行時にエラー発生しました。
ウェブサイトから入手した `MySQL Connector/NET` は、.NET Framework 用のようです。

上記で参照に追加した `MySql.Data` を削除します。
Visual Studio の「Nuget パッケージの管理」を開いて `Data.System.SqlClient` をインストールします。

上記と同じコードを実行してみます。

# Oracle データベースに接続する

続いて、Oracle データベースに接続する .NET アプリを作成してみます。

## Oracle データベースを用意する

データベースサーバを導入するマシンを用意します。

Oracle データベースは Windows 、Linux  、Solaris 、HP-UX 、IBM AIX で動作する製品があります。
通常はサーバ機＋サーバ OS を使いますが、クライアント用パソコン＋Windows 11 でも動作します。

Oracle データベースを導入します。今回は無償版を使います。

[Oracle Database XE (21c) をWindows PCで使ってみた | O-Labo](https://o-labo.info/tried-oracle-database-xe-21c/)

加えて、管理ツールである Oracle SQL Developer を導入します。

[Oracle SQL Developerのインストール #oracle - Qiita](https://qiita.com/mi_h/items/415e3df0681552841576)

導入できたデータベースエンジンに対してデータベース領域を作成します。`XE 21c` のインストーラはデータベース `XEPDB1` を作成してくれるので、これを使うので構いません。
データベースに接続するユーザを管理者と別に用意しておきます。よく使われる `scott/tiger` を登録しておくといいでしょう。

[【Oracleデータベース】Windowsでインストールからテーブル作成まで #oracle - Qiita](https://qiita.com/YouKnow/items/1d5b695629af75465dcd)

さらに、サンプルデータを導入しておきましょう。

[Oracle Database 21c XEでサンプルスキーマを作成したい #oracle - Qiita](https://qiita.com/neko_the_shadow/items/16135d324dea53edc9c9)

データベースサーバを動作するコンピュータと、それに接続するアプリを動作するコンピュータは、通常は別々です。
Oracle データベースをインストールした直後は、別のコンピュータから接続できるようになっていません。設定を変更します。

[Database/Oracle/tips/外部からの接続を許可したい - 豚吐露＠wiki](https://w.atwiki.jp/ohden/pages/738.html)

[Oracle 外部からDBに接続できない件 | 技術的なこと、あれこれ](http://www.sakutyuu.com/technology/?p=913)

## .NET Framework＋System.Data.OracleClient で接続する

まず、.NET Framework アプリを作って Oracle データベースに接続してみます。

参考：[【C#】データベースに接続しよう！Oracle編 | ＳＥシステム開発屋の戯言／ヨッシーブログ](https://yossy.penne.jp/wordpress/2024/05/04/csharp-dbconnect-oracle/)

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ (.NET Framework）」を選択します。
フレームワークは `.NET Framework 4.5.2` を選択します。

プロジェクトの「参照」に `System.Data.OracleClient` を追加します。

以下のコードを実行してみます。

```csharp
using System.Data.OracleClient;
            
string conStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)));User id=scott;Password=tiger;";

try
{
    using (OracleConnection cn = new OracleConnection())
    {
        cn.ConnectionString = conStr;
        cn.Open();
        Console.WriteLine("Connected.");
    }
}
catch (Exception ex) {
    Console.WriteLine("Error: " + ex.Message);
}
Console.ReadKey();
```

`ConnectionString` にセットする文字列は、接続したいデータベースに合わせて記述します。

[ODP.NET の接続文字列 - tsucchi’s diary](https://tsucchi.hatenadiary.com/entry/20080522/1211469827)

`Data Source` は、事前に準備した Oracle データベースを指定します。
`User ID` および `Password` に、予め用意したアカウントとパスワードを指定します。

ここで使用している `System.Data.OracleClient` は、.NET Framework に用意されている SQL Server に接続するためのライブラリです。`System.Data.OracleClient` のバージョン 4.0.0 でした。

## .NET＋System.Data.OracleClient で接続する

続いて、.NET アプリを作って Oracle データベースに接続してみます。

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ」を選択します。
フレームワークは `.NET 8.0` を選択します。

.NET Framework と違って、プロジェクトの「参照」に `System.Data.OracleClient` を追加できません。
「Nuget パッケージの管理」を開いて `Data.System.OracleClient` を探しますが、ありません。
.NET 8.0 では `System.Data.OracleClient` を使って接続するのはだめなようです。

## .NET Framework＋Oracle.ManagedDataAccess.Client を使って接続する

`System.Data.OracleClient` は .NET Framework に含まれるライブラリですが、.NET Framework 4.0 から非推奨になりました。
そこで、Oracle 社が提供している接続用ライブラリを使用します。

参考：[Oracle Data Provider for .NET管理対象ドライバのインストール](https://docs.oracle.com/cd/F25238_01/odpnt/installODPmd.html)

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ (.NET Framework）」を選択します。
フレームワークは `.NET Framework 4.7.2` を選択します。4.5.2 では 後述のライブラリをインストールできませんでした。

Visual Studio の「Nuget パッケージの管理」を開いて `Oracle.ManagedDataAccess` をインストールします。バージョン 23.6.0 でした。

以下のコードを実行してみます。

```csharp
using Oracle.ManagedDataAccess.Client;
            
string conStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)));User Id=scott;Password=tiger;";

try
{
    using (OracleConnection cn = new OracleConnection())
    {
        cn.ConnectionString = conStr;
        cn.Open();
以下略
```

## .NET＋Oracle.ManagedDataAccess.Client を使って接続する

Visual Studio で「新しいプロジェクトの作成」して「コンソールアプリ」を選択します。
フレームワークは `.NET 8.0` を選択します。

Visual Studio の「Nuget パッケージの管理」を開いて `Oracle.ManagedDataAccess` をインストールします。
すると「プロジェクトのターゲットフレーム 'net8.0' ではなく '.NETFramework（以下略）」と警告されます。
`Oracle.ManagedDataAccess.Core` をインストールします。バージョン 23.6.0 でした。

参考：[Oracle Data Provider for .NET Coreのインストール](https://docs.oracle.com/cd/F25238_01/odpnt/InstallODPCore.html)

上記と同じコードを実行してみます。