.NET on Power を動かしてみた話 #4 - MariaDBへODBCドライバを使用して接続

今回は、.NET on Powerを動かしてみた話シリーズの第4回として、MariaDBへのODBCドライバ接続を試してみたいと思います。もしまだ本シリーズを読んだことがない方は、よろしければ第一回の以下の記事をご覧いただけると嬉しいです。.NET on Powerに関連する最初の情報をご確認いただけるかと思います。

https://qiita.com/Nakaji1106/items/f0761c4d1dce58c0b8d5

## 0. 今回の流れと検証環境について

簡単に本記事の流れと検証環境について記載していきたいと思います。
もともと今回の内容は、.NET on Powerの情報を発信している以下のブログ記事をベースに記載しています。英語の文面ではありますが、大元の情報を確認されたい場合は、こちらも合わせて見ていただけるとより理解を深めていただけるかと思います。

https://community.ibm.com/community/user/powerdeveloper/blogs/sapana-khemkar/2022/12/27/connecting-a-net-application-to-mariadb-using-an-o

https://community.ibm.com/community/user/powerdeveloper/blogs/linda-alkire-kinnunen/2023/01/14/dotnet-on-ibm-power-resources-for-developers

<b>[今回の流れ]</b>

今回は、RHEL8.7 ppc64leの環境をベースに検証を行なっています。本記事ではRHEL環境の導入作業は省略し、MariaDBや.NETなどの周辺環境のセットアップから記載しています。

1. MariaDBサーバ環境のセットアップ(対象マシン名 : dotNet-mariadb)
1. ODBCドライバの導入(対象マシン名 : dotNet-test)
1. .NET環境のセットアップ(対象マシン名 : dotNet-test)
1. サンプル.NETアプリケーションを作成(対象マシン名 : dotNet-test)

<b>[検証環境]</b>

|Host Name|OS|導入パッケージ|
|:---|:---|:---|
|dotNet-mariadb|RHEL 8.7 ppc64le <br> (kernel : 4.18.0-425.3.1.el8.ppc64le)|mariadb-server : 10.3.35-1|
|dotNet-test|RHEL 8.7 ppc64le <br> (kernel : 4.18.0-425.3.1.el8.ppc64le)|.NET : 7.0.107<br> unixODBC : 2.3.7-1.el8.ppc64le <br> mariadb-connector-odbc :3.1.12-1.el8.ppc64le|



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613078/65f1153f-6c84-931d-eb53-2ac0a100004d.png)



## 1. MariaDBサーバ環境のセットアップ(対象マシン名 : dotNet-mariadb)

#### 1-1. MariDBサーバのインストール

```
[root@dotNet-mariadb ~]# dnf install -y mariadb-server
```

#### 1-2. MariaDBサーバの起動とサービス有効化

インストールしたMariaDBサーバのサービスを起動させます。またOS再起動後も自動でサービスが起動するようにサービスの有効化の実施します。

```
[root@dotNet-mariadb ~]# systemctl start mariadb.service
[root@dotNet-mariadb ~]# systemctl enable mariadb.service
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
```

#### 1-3. MySQLのサンプルデータを取得

まず、以下のMySQLのコミュニティから、サンプルデータを取得します。今回は、"word database"のサンプルデータを活用するために、zipファイルダウンロードします。

https://dev.mysql.com/doc/index-other.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613078/aba0abc2-c8ea-7989-ecb7-43fe0bdd91b8.png)

```
[root@dotNet-mariadb mysql_sample]# pwd
/root/mysql_sample
[root@dotNet-mariadb mysql_sample]# wget https://downloads.mysql.com/docs/world-db.zip
[root@dotNet-mariadb mysql_sample]# ls
world-db.zip
```

#### 1-4. MySQLのサンプルデータを展開

MySQLのコミュニティよりダウンロードしたzipファイルを展開します。

```
[root@dotNet-mariadb mysql_sample]# unzip world-db.zip 
Archive:  world-db.zip
   creating: world-db/
  inflating: world-db/world.sql      
[root@dotNet-mariadb mysql_sample]# ls
world-db  world-db.zip
[root@dotNet-mariadb mysql_sample]# ls world-db
world.sql
```

#### 1-5. MariaDBへサンプルデータを読み込みと内容の確認

読み込んだサンプルデータを読み込みます。

```
[root@dotNet-mariadb mysql_sample]# mysql -uroot -p  < world-db/world.sql
Enter password:
```

次に、読み込んだデータの内容を確認します。
"world"データベースが追加され、その中にはcityやcountryなどのテーブルが作成されています。

```
[root@dotNet-mariadb mysql_sample]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| world              |
+--------------------+
4 rows in set (0.000 sec)

MariaDB [(none)]> use world;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [world]> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.000 sec)

MariaDB [world]> select * from city limit 20;
+----+-------------------+-------------+---------------+------------+
| ID | Name              | CountryCode | District      | Population |
+----+-------------------+-------------+---------------+------------+
|  1 | Kabul             | AFG         | Kabol         |    1780000 |
|  2 | Qandahar          | AFG         | Qandahar      |     237500 |
|  3 | Herat             | AFG         | Herat         |     186800 |
|  4 | Mazar-e-Sharif    | AFG         | Balkh         |     127800 |
|  5 | Amsterdam         | NLD         | Noord-Holland |     731200 |
|  6 | Rotterdam         | NLD         | Zuid-Holland  |     593321 |
|  7 | Haag              | NLD         | Zuid-Holland  |     440900 |
|  8 | Utrecht           | NLD         | Utrecht       |     234323 |
|  9 | Eindhoven         | NLD         | Noord-Brabant |     201843 |
| 10 | Tilburg           | NLD         | Noord-Brabant |     193238 |
| 11 | Groningen         | NLD         | Groningen     |     172701 |
| 12 | Breda             | NLD         | Noord-Brabant |     160398 |
| 13 | Apeldoorn         | NLD         | Gelderland    |     153491 |
| 14 | Nijmegen          | NLD         | Gelderland    |     152463 |
| 15 | Enschede          | NLD         | Overijssel    |     149544 |
| 16 | Haarlem           | NLD         | Noord-Holland |     148772 |
| 17 | Almere            | NLD         | Flevoland     |     142465 |
| 18 | Arnhem            | NLD         | Gelderland    |     138020 |
| 19 | Zaanstad          | NLD         | Noord-Holland |     135621 |
| 20 | ´s-Hertogenbosch  | NLD         | Noord-Brabant |     129170 |
+----+-------------------+-------------+---------------+------------+
20 rows in set (0.000 sec)

```

今回の.NETアプリケーションからの接続検証では、このデータを活用したいと思います。

#### 1-6. MariaDBへの外部接続用ユーザの作成

MariaDBへ外部からアクセス可能なユーザを作成します。デフォルトではrootユーザのみが作成されており、localhostなど自身からの接続が有効となっています。
今回は、"dotNet-user"というユーザを作成し、このユーザであれば外部からアクセス可能とする設定にします。

```
[root@dotNet-mariadb mysql_sample]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.3.35-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


# デフォルトで設定されている内容を確認
MariaDB [(none)]> select user,host from mysql.user
    -> ;
+------+----------------+
| user | host           |
+------+----------------+
| root | 127.0.0.1      |
| root | ::1            |
| root | dotnet-mariadb |
| root | localhost      |
+------+----------------+
4 rows in set (0.001 sec)


# "dotNet-user"を新規で作成
MariaDB [(none)]> CREATE USER "dotNet-user" IDENTIFIED BY '';
Query OK, 0 rows affected (0.001 sec)

# "dotNet-user"へ対象のMariaDBに対して外部からのアクセス権を付与
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'dotNet-user'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.000 sec)

# 設定変更の確認
MariaDB [(none)]> select user,host from mysql.user
    -> ;
+-------------+----------------+
| user        | host           |
+-------------+----------------+
| dotNet-user | %              |
| root        | 127.0.0.1      |
| root        | ::1            |
| root        | dotnet-mariadb |
| root        | localhost      |
+-------------+----------------+
5 rows in set (0.000 sec)
```

以上で、MariaDBに対しての設定は終了です。続いて、dotNetアプリケーション側の設定を実施します。

## 2. ODBCドライバの導入(対象マシン名 : dotNet-test)

#### 2-1. unixODBC driver managerとMariaDB ODBC connectorを導入

```
[root@dotNet-test ~]# dnf install -y unixODBC.ppc64le unixODBC-devel.ppc64le
[root@dotNet-test ~]# dnf install -y mariadb-connector-odbc.ppc64le
```

#### 2-2. 導入したODBCドライバの状態を確認

```
# 現在のunixODBCの構成情報を確認
[root@dotNet-test ~]# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

# 導入されているどODBCドライバのリストを一覧
[root@dotNet-test ~]# odbcinst -q -d
[PostgreSQL]
[MySQL]
[FreeTDS]
[MariaDB]

# MariaDBのドライバの構成情報を確認
[root@dotNet-test ~]# odbcinst -q -d -n MariaDB
[MariaDB]
Description=ODBC for MariaDB
Driver=/usr/lib/libmaodbc.so
Driver64=/usr/lib64/libmaodbc.so
FileUsage=1

[root@dotNet-test ~]# ll /usr/lib64/libmaodbc.so
-rwxr-xr-x. 1 root root 410672 12月  8  2021 /usr/lib64/libmaodbc.so
```

上記では、今回の検証で使用するMariaDBのODBCドライバ情報を確認しましたが、例えばPostgreSQLについても同様に確認が可能です。その為、もしPostgreSQL環境へのセットアップも同様の内容で実施可能そうですね。

```
[root@dotNet-test ~]# odbcinst -q -d -n PostgreSQL
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

[root@dotNet-test ~]# ll /usr/lib64/libodbcpsqlS.so
lrwxrwxrwx. 1 root root 21 Aug 23  2018 /usr/lib64/libodbcpsqlS.so -> libodbcpsqlS.so.2.0.0
```

## 3. .NET環境のセットアップ(対象マシン名 : dotNet-test)

今回の検証で使用する.NET環境をインストールします。インストール対象のマシンは先ほどODBCドライバを導入したdotNet-testとなります。

```
[root@dotNet-test ~]# dnf install -y dotnet
[root@dotNet-test ~]# dotnet --version
7.0.107
```

## 4. サンプル.NETアプリケーションを作成(対象マシン名 : dotNet-test)

#### 4-1. dotnet new コマンドでコンソールアプリケーションを作成

```
[root@dotNet-test ~]# dotnet new console -o odbc_sample

Welcome to .NET 7.0!
---------------------
SDK Version: 7.0.107

----------------
Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only).
Learn about HTTPS: https://aka.ms/dotnet-https
----------------
Write your first app: https://aka.ms/dotnet-hello-world
Find out what's new: https://aka.ms/dotnet-whats-new
Explore documentation: https://aka.ms/dotnet-docs
Report issues and find source on GitHub: https://github.com/dotnet/core
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
--------------------------------------------------------------------------------------
The template "Console App" was created successfully.

Processing post-creation actions...
Restoring /root/odbc_sample/odbc_sample.csproj:
  Determining projects to restore...
  Restored /root/odbc_sample/odbc_sample.csproj (in 345 ms).
Restore succeeded.

[root@dotNet-test ~]# cd odbc_sample/
[root@dotNet-test odbc_sample]# ls
Program.cs  obj  odbc_sample.csproj
```

#### 4-2. dotnet add packageコマンドでSystem.Data.Odbcパッケージを導入

```
[root@dotNet-test odbc_sample]# dotnet add package System.Data.Odbc
[root@dotNet-test odbc_sample]# cat odbc_sample.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Data.Odbc" Version="7.0.0" />
  </ItemGroup>

</Project>
```

#### 4-3. Program.csを編集

Program.csファイルを以下のように編集します。編集時には、先ほどMariaDBのアクセス情報やインポートしたDBの情報を追加します。例えば、先ほどインポートしたサンプルデータを使用するためには、❷にはデータベース名として"world"、❸にはテーブル名として"city"を指定します。

❶ : MariaDBへのアクセス情報(IPアドレス情報)
❷ : 使用するデータベース名 (例 : world)
❸ : 使用するユーザ名 (例 : dotNet-user)
❹ : 使用するテーブルの名 (例 : city)

```
[root@dotNet-test odbc_sample]# cat Program.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Odbc;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string MyConString = "DRIVER={MariaDB}; " +
            "SERVER=<❶ Your MariaDB Name or IP address>; " +
            "DATABASE=<❷ Database Name>; " +
            "UID=<❸ Access User Name>; " +
            "PWD=;"; 

            OdbcConnection DbConnection = new OdbcConnection(MyConString);
            DbConnection.Open();

            OdbcCommand DbCommand = DbConnection.CreateCommand();

            DbCommand.CommandText = "SELECT * FROM <❹ Table Name> limit 20";
            OdbcDataReader DbReader = DbCommand.ExecuteReader();

            int fCount = DbReader.FieldCount;

            Console.Write( ":" );
            for ( int i = 0; i < fCount; i ++ )
            {
                String fName = DbReader.GetName(i);
                Console.Write( fName + ":" );
            }
            Console.WriteLine();

            while( DbReader.Read())
            {
                Console.Write( ":" );
                for (int i = 0; i < fCount; i++)
                {
                    String col = DbReader.GetString(i);
                    Console.Write(col + ":");
                }
                Console.WriteLine();
            }
            DbReader.Close();
            DbCommand.Dispose();
            DbConnection.Close();
        }
    }
}                       
```

#### 4-3. dotnet build を使用してプロジェクトをビルド

program.csの編集が完了したところで、プロジェクトをビルドします。

```
[root@dotNet-test odbc_sample]# dotnet build
MSBuild version 17.4.4+8e9cb2952 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  odbc_sample -> /root/odbc_sample/bin/Debug/net7.0/odbc_sample.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:09.38
```

#### 4-4. dotnet run を使用してアプリケーションを実行

それでは早速、dotnet runで作成してアプリケーションを実行して見たいと思います。

```
[root@dotnet-test odbc_sample]# dotnet run
:ID:Name:CountryCode:District:Population:
:1:Kabul:AFG:Kabol:1780000:
:2:Qandahar:AFG:Qandahar:237500:
:3:Herat:AFG:Herat:186800:
:4:Mazar-e-Sharif:AFG:Balkh:127800:
:5:Amsterdam:NLD:Noord-Holland:731200:
:6:Rotterdam:NLD:Zuid-Holland:593321:
:7:Haag:NLD:Zuid-Holland:440900:
:8:Utrecht:NLD:Utrecht:234323:
:9:Eindhoven:NLD:Noord-Brabant:201843:
:10:Tilburg:NLD:Noord-Brabant:193238:
:11:Groningen:NLD:Groningen:172701:
:12:Breda:NLD:Noord-Brabant:160398:
:13:Apeldoorn:NLD:Gelderland:153491:
:14:Nijmegen:NLD:Gelderland:152463:
:15:Enschede:NLD:Overijssel:149544:
:16:Haarlem:NLD:Noord-Holland:148772:
:17:Almere:NLD:Flevoland:142465:
:18:Arnhem:NLD:Gelderland:138020:
:19:Zaanstad:NLD:Noord-Holland:135621:
:20:´s-Hertogenbosch:NLD:Noord-Brabant:129170:
```

MariaDB側で確認した"DB:world"に含まれる"Table:city"の内容が問題なく表示されました。.NETアプリケーションからODBCドライバを使用して、MariaDB側にアクセスができていることが確認できましたね。

## まとめ

今回は、IBM社が作成している.NET on Powerのブログの内容から、ODBCドライバを介したMariaDBへの接続について確認をしてみました。もともとIBM Powerは、その信頼性と性能の高さからMariaDBやPostgreSQLなどのRDBMSのシステム基盤として長らく活用されてきましたが、今回のように対象のRDBMSへアクセスしにくる.NETアプリケーションも同一のIBM Power上で利用できるようになることは、メリットが大きいのではないでしょうか。これでIBM Powerの高い性能がもたらす高集約率というメリットを活かせるシーンが増えましね。今後は、MariaDB以外のDBに対しての接続テストも実施してみたいと思います。

それでは今回の記事は以上となります。本記事が何かのお役に立てましたら幸いです。