このページに記載の情報は、2005 年にリリースした PowerGres Plus V2 を対象としています。PowerGres Plus V2 の販売はすでに終了しています。
PowerGres Plus の最新バージョンに関する情報は、製品紹介ページまたは PowerGres 体験記ページを参照してください。
SRA OSS では、Oracle データベースなど他のデータベースから、PostgreSQL や PowerGres へのマイグレーションサービスを提供しています。
詳細は「データベースマイグレーションサービス」のページをご覧ください。
これまで、SQL Serverマイグレーションでは、Visual Studio.NETでアプリケーションを開発する手順や、SQL Serverからデータベースを移行する手順についてご紹介しました。最終回の今回は、SQL Serverで作成されたアプリケーションをPowerGres Plusに移行する手順をご紹介します。
.NET Frameworkを使用したデータベースアプリケーションは、ADO.NETという標準インタフェースを使用します。 ADO.NETには、データベースごとに、この標準インタフェースをサポートするクラス(データプロバイダ)が提供されています。 アプリケーションの移行作業のほとんどは、このクラスの呼び出し先を変更する簡単な修正で実現できます。
今回も前回に引き続き、コミュニティで公開しているSQL Server からPostgreSQLへの移行資料 “Conversion of Microsoft SQL/ASP applications to PostgreSQL”の内容にそって、アプリケーションの移行を行います。この資料は、以下のURLから参照できます。
https://www.postgresql.org/docs/techdocs.3
または
移行モデルですが、データベースのバージョンは、SQL Server 2005と、PowerGres Plus V2.0 Windows版とします。アプリケーションは、“第2回 Visual Studio .NETを使ったアプリケーション開発”でご紹介したサンプルをSQL Server上に構築し、これをPowerGres Plusに移行します。

図 1: 移行モデル
ADO.NETを使用したアプリケーションの移行は、以下の点を考慮する必要があります。
以下、これらの点にについてご紹介します。
ADO.NETには、基本となるインタフェースがあり、データプロバイダが実装しなければならないプロパティやメソッドの名前と型が定義されています。データプロバイダは、これをもとにインタフェースを提供しています。
データプロバイダには、各種データベース専用のインタフェースと汎用インタフェース(OLE DBおよびODBC)があり、データベース専用のインタフェースは、クラス名にデータベース固有のプレフィックスを含みます。したがって、アプリケーションの移行では、 SQL Server用のインタフェースを呼び出している箇所をPostgreSQL用のインタフェースを呼び出すように修正します。

図 2: ADO.NETのデータプロバイダ
では、実際に以下の手順で、サンプルアプリケーションを修正してみます。
| ステップ | 項目 | 内容 |
|---|---|---|
| 1 | 準備 | 開発環境、データベース、サンプルアプリケーションを準備します。 |
| 2 | アプリケーションプロジェクトの展開 | サンプルアプリケーションのプロジェクトを開きます。 |
| 3 | アプリケーションの実行(移行前) | SQL Serverを参照する移行前のアプリケーションを動かしてみます。 |
| 4 | アプリケーションの修正 | アプリケーションのソースコードを修正します。 |
| 5 | アプリケーションの実行(移行後) | PowerGres Plusを参照する移行後のアプリケーションを動かしてみます。 |
開発環境は、“第1回 .NET Framework上での動作のしくみと準備”で作成した環境を使用します。
データベースは、“第3回 データベースの移行”でご紹介したSQL ServerとPowerGres Plusの環境を使用しますので、これを準備します。
サンプル一覧に掲載されているサンプルプロジェクト(sample_mssql.zipを解凍)を用意し、フォルダごと、マイドキュメントの“Visual Studio 2005\Projects”にコピーします。
Visual Studio 2005を起動し、[ファイル]メニューから、[開く] の[プロジェクト/ソリューション] を選択します。
ファイル一覧から、“sample_mssql”フォルダの“sample_mssql.sln”を選択し、プロジェクトを開きます。
図 3: サンプルアプリケーションのプロジェクト
移行を行う前に、サンプルアプリケーションを確認してみます。
[デバッグ]メニューから、[デバッグなしで開始]を選択します。以下のように、SQL Serverのデータを参照するアプリケーションが起動します。確認ができたら、アプリケーションを終了します。
図 4: SQL Serverを参照するサンプルプログラム
使用するデータプロバイダを指定するusing宣言を、Npgsqlを使用するように書き換えます。
[表示]メニューから[ソリューションエクスプローラ]を選択し、“Form1.cs”を開きます。
冒頭のusing 宣言を以下のように修正します。
using System.Data.SqlClient;
↓
using Npgsql;
インタフェースのクラス名をNpgsqlのものに書き換えます。
“Form1.cs”のbutton1_Clickクラスで呼び出しているSqlConnection、SqlCommand、SqlDataReaderのプレフィックスをNpgsqlに修正します。
| SQL Server | PowerGres Plus | 機能 |
|---|---|---|
| SqlConnection | NpgsqlConnection | データベースへの接続 |
| SqlCommand | NpgsqlCommand | SQLコマンドの実行 |
| SqlDataReader | NpgsqlDataReader | データの読み取り |
データベースへの接続情報は使用するデータベースシステム毎に異なるので、接続情報をPowerGres Plusのものに書き換えます。
NpgsqlConnectionの接続情報をご使用の環境に合わせて設定します。
| 引数 | 内容 |
|---|---|
| Server | サーバのホスト名、またはIPアドレス |
| Port | ポート番号 |
| UserId | ユーザ名 |
| Password | パスワード |
| Database | データベース名 |
以上で、プログラムの修正は完了です。 修正前と修正後のソースコードは、以下のようになります。太字が修正箇所です。
修正前
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
〜〜〜
中略
〜〜〜
private void button1_Click(object sender, EventArgs e)
{
//接続情報の作成
string connStr = "Server=(local);"
+ "Trusted_Connection=yes;"
+ "database=sample";
SqlConnection conn = new SqlConnection(connStr);
//接続
conn.Open();
//データを取得し、DataSet へ格納
SqlCommand comm1 = new SqlCommand("SELECT * FROM user_info",conn);
SqlDataAdapter adp1 = new SqlDataAdapter(comm1);
SqlCommand comm2 = new SqlCommand ("SELECT * FROM user_phone",conn);
SqlDataAdapter adp2 = new SqlDataAdapter(comm2);
DataSet ds = new DataSet() ;
adp1.Fill(ds,"UserInfo");
adp2.Fill(ds,"UserPhone");
//2 つの DataSet にリレーションを設定
DataRelation UserPhoneRel ;
UserPhoneRel = new DataRelation("UserDetail",
ds.Tables["UserInfo"].Columns["user_id"],
ds.Tables["UserPhone"].Columns["user_id"]);
ds.Relations.Add(UserPhoneRel);
//データベースへの接続を切断
conn.Close ();
//グリッドコントロールに DataSet を連結
dataGridView1.DataSource = ds;
dataGridView1.DataMember="UserInfo";
//DataSet の内容を XMLファイルとして出力
UserPhoneRel.Nested=true;
ds.WriteXml("..\\..\\user.xml");
}
修正後
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using Npgsql;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
〜〜〜
中略
〜〜〜
private void button1_Click(object sender, EventArgs e)
{
//接続情報の作成
string connStr = "Server=localhost;"
+ "Port=5432;"
+ "UserId=Administrator; "
+ "Password=pass;"
+ "Database=sample";
NpgsqlConnection conn = new NpgsqlConnection(connStr);
//接続
conn.Open();
//データを取得し、DataSet へ格納
NpgsqlCommand comm1 = new NpgsqlCommand("SELECT * FROM user_info",conn);
NpgsqlDataAdapter adp1 = new NpgsqlDataAdapter(comm1);
NpgsqlCommand comm2 = new NpgsqlCommand("SELECT * FROM user_phone",conn);
NpgsqlDataAdapter adp2 = new NpgsqlDataAdapter(comm2);
DataSet ds = new DataSet() ;
adp1.Fill(ds,"UserInfo");
adp2.Fill(ds,"UserPhone");
//2 つの DataSet にリレーションを設定
DataRelation UserPhoneRel ;
UserPhoneRel = new DataRelation("UserDetail",
ds.Tables["UserInfo"].Columns["user_id"],
ds.Tables["UserPhone"].Columns["user_id"]);
ds.Relations.Add(UserPhoneRel);
//データベースへの接続を切断
conn.Close ();
//グリッドコントロールに DataSet を連結
dataGridView1.DataSource = ds;
dataGridView1.DataMember="UserInfo";
//DataSet の内容を XMLファイルとして出力
UserPhoneRel.Nested=true;
ds.WriteXml("..\\..\\user.xml");
}
移行後のアプリケーションを実行してみます。
[デバッグ]メニューから、[デバッグ開始]または [デバッグなしで開始]を選択します。
今度は、以下のようにPowerGres Plusを参照するアプリケーションが起動します。
図 5: PowerGres Plusを参照するサンプルプログラム
多くのデータベースは、標準SQLに規定されていない独自の演算子と関数をもっています。しかし、ほとんどの場合、その機能は他のデータベースでも別名で実現されています。
以下の表は、主なSQL Server独自の演算子と関数をPowerGres Plusでどのように置き換えることができるかをまとめたものです。
| SQL Server | PowerGres Plus | 機能 |
|---|---|---|
| + | || | 文字列接続演算子 |
| replicate(char, int) | repeat(char, int) | 文字式の指定回数繰り返し |
| space(int) | repeat(‘ ‘, int) | 連続するスペース文字列の取得 |
| isnull() | coalesce() | NULL 値の置き換え |
| getdate() | now() | 現在の日付と時刻の取得 |
| datediff() |
該当する関数は存在しない。
例: |
2つの時間の差を日付および時間の単位で取得 |
| convert() | to_char() | 日付型のような数値型のデータを文字列に変換 |
| charindex() | position() | 特定文字列の開始位置取得 |
アプリケーションの移行では、このような演算子、関数の使用を考慮し、これらを使用している場合には、適切な置き換え処理が必要です。
移行資料には、 上記のSQL Serverの演算子と関数をPowerGres Plusに登録するSQLスクリプト “mssqlcomp.sql”が付録として添付されています。
図 6: mssqlcomp.sql
これを利用すると、SQL Server 独自の演算子と関数をPowerGres Plusでもそのまま使用することができます。“mssqlcomp.sql”は、サンプル一覧 にも掲載していますので、内容をご確認の上、ご利用ください。
では、実際にこのSQLスクリプトをPowerGres Plusで実行して、登録した関数を呼び出してみます。
psql コマンドでデータベースに接続し、以下のように入力します。
\i mssqlcomp.sqlのパス
関数の登録に成功すると、以下にように表示されます。

図 7: mssqlcomp.sqlの実行結果
登録した関数を実行してみます。
以下の例は、“mssqlcomp.sql”に記述されているSQL Server 独自の関数、getdate(現在時刻の取得)を呼び出した結果です。PowerGres Plusからもそのまま呼び出すことができました。

図 8: 登録関数の呼び出し結果
これまで、4回にわたって.NET Framework上でのアプリケーション開発と、SQL Server からの移行手順をご紹介してきました。
最新の.NET開発環境は、機能が充実しており、簡単な操作でアプリケーションを作成することができます。PostgreSQL用のデータプロバイダ Npgsqlは、Gborgというプロジェクトで開発、提供されています。開発当初は、マルチバイトへの対応が遅れていたこともあり、国内ではそれほど普及していませんでしたが、近年はUnicodeにも対応しており、.NET上での開発環境は整いました。
SQL Serverからの移行を検討されている方には、コミュニティで公開している移行資料“Conversion of Microsoft SQL/ASP applications to PostgreSQL”は、貴重な情報です。コミュニティの技術資料公開ページには、これ以外にも.Netの開発で参考になる情報が公開されていますので、参照してみてはいかがでしょうか。