PowerGres

技術情報 | PowerGres体験記 | 第 4 回 アプリケーションの移行 – SQL Server マイグレーション

このページに記載の情報は、2005 年にリリースした PowerGres Plus V2 を対象としています。PowerGres Plus V2 の販売はすでに終了しています。

PowerGres Plus の最新バージョンに関する情報は、製品紹介ページまたは PowerGres 体験記ページを参照してください。

SRA OSS では、Oracle データベースなど他のデータベースから、PostgreSQL や PowerGres へのマイグレーションサービスを提供しています。

詳細は「データベースマイグレーションサービス」のページをご覧ください。

第 4 回 アプリケーションの移行 『意外と簡単!! プログラム修正』

はじめに

これまで、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

または

https://techdocs.postgresql.org/

アプリケーションの移行モデル

移行モデルですが、データベースのバージョンは、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用のインタフェースを呼び出すように修正します。

ADO.NETのデータプロバイダ

図 2: ADO.NETのデータプロバイダ

では、実際に以下の手順で、サンプルアプリケーションを修正してみます。

表 1: 移行のステップ
ステップ 項目 内容
1 準備 開発環境、データベース、サンプルアプリケーションを準備します。
2 アプリケーションプロジェクトの展開 サンプルアプリケーションのプロジェクトを開きます。
3 アプリケーションの実行(移行前) SQL Serverを参照する移行前のアプリケーションを動かしてみます。
4 アプリケーションの修正 アプリケーションのソースコードを修正します。
5 アプリケーションの実行(移行後) PowerGres Plusを参照する移行後のアプリケーションを動かしてみます。
ステップ1:準備

開発環境は、“第1回 .NET Framework上での動作のしくみと準備”で作成した環境を使用します。

データベースは、“第3回 データベースの移行”でご紹介したSQL ServerとPowerGres Plusの環境を使用しますので、これを準備します。

サンプル一覧に掲載されているサンプルプロジェクト(sample_mssql.zipを解凍)を用意し、フォルダごと、マイドキュメントの“Visual Studio 2005\Projects”にコピーします。

ステップ2:アプリケーションプロジェクトの展開

Visual Studio 2005を起動し、[ファイル]メニューから、[開く] の[プロジェクト/ソリューション] を選択します。

ファイル一覧から、“sample_mssql”フォルダの“sample_mssql.sln”を選択し、プロジェクトを開きます。

サンプルアプリケーションのプロジェクト

図 3: サンプルアプリケーションのプロジェクト

ステップ3:アプリケーションの実行(移行前)

移行を行う前に、サンプルアプリケーションを確認してみます。

[デバッグ]メニューから、[デバッグなしで開始]を選択します。以下のように、SQL Serverのデータを参照するアプリケーションが起動します。確認ができたら、アプリケーションを終了します。

SQL Serverを参照するサンプルプログラム

図 4: SQL Serverを参照するサンプルプログラム

ステップ4:アプリケーションの修正

using 宣言の修正

使用するデータプロバイダを指定するusing宣言を、Npgsqlを使用するように書き換えます。

[表示]メニューから[ソリューションエクスプローラ]を選択し、“Form1.cs”を開きます。

冒頭のusing 宣言を以下のように修正します。

using System.Data.SqlClient;
     ↓
using Npgsql;

データベースアクセス用インタフェースの修正

インタフェースのクラス名をNpgsqlのものに書き換えます。

“Form1.cs”のbutton1_Clickクラスで呼び出しているSqlConnection、SqlCommand、SqlDataReaderのプレフィックスをNpgsqlに修正します。

表2: クラス名の対応
SQL Server PowerGres Plus 機能
SqlConnection NpgsqlConnection データベースへの接続
SqlCommand NpgsqlCommand SQLコマンドの実行
SqlDataReader NpgsqlDataReader データの読み取り

データベース接続情報の修正

データベースへの接続情報は使用するデータベースシステム毎に異なるので、接続情報をPowerGres Plusのものに書き換えます。

NpgsqlConnectionの接続情報をご使用の環境に合わせて設定します。

表3: 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");
 }
ステップ5:アプリケーションの実行(移行後)

移行後のアプリケーションを実行してみます。

[デバッグ]メニューから、[デバッグ開始]または [デバッグなしで開始]を選択します。

今度は、以下のようにPowerGres Plusを参照するアプリケーションが起動します。

PowerGres Plusを参照するサンプルプログラム

図 5: PowerGres Plusを参照するサンプルプログラム

データベース独自関数の修正

多くのデータベースは、標準SQLに規定されていない独自の演算子と関数をもっています。しかし、ほとんどの場合、その機能は他のデータベースでも別名で実現されています。

以下の表は、主なSQL Server独自の演算子と関数をPowerGres Plusでどのように置き換えることができるかをまとめたものです。

表4: SQL Server独自の演算子、関数の対応
SQL Server PowerGres Plus 機能
+ || 文字列接続演算子
replicate(char, int) repeat(char, int) 文字式の指定回数繰り返し
space(int) repeat(‘ ‘, int) 連続するスペース文字列の取得
isnull() coalesce() NULL 値の置き換え
getdate() now() 現在の日付と時刻の取得
datediff()

該当する関数は存在しない。
以下のようにCASTを使用して
置き換え可能。

例:
DATEDIFF(dd, foo1, foo2) = 0
        ↓
CAST(foo2 – foo1 as int) = 0

2つの時間の差を日付および時間の単位で取得
convert() to_char() 日付型のような数値型のデータを文字列に変換
charindex() position() 特定文字列の開始位置取得

アプリケーションの移行では、このような演算子、関数の使用を考慮し、これらを使用している場合には、適切な置き換え処理が必要です。

移行資料には、 上記のSQL Serverの演算子と関数をPowerGres Plusに登録するSQLスクリプト “mssqlcomp.sql”が付録として添付されています。

mssqlcomp.sql

図 6: mssqlcomp.sql

これを利用すると、SQL Server 独自の演算子と関数をPowerGres Plusでもそのまま使用することができます。“mssqlcomp.sql”は、サンプル一覧 にも掲載していますので、内容をご確認の上、ご利用ください。

では、実際にこのSQLスクリプトをPowerGres Plusで実行して、登録した関数を呼び出してみます。

SQLスクリプトの実行

psql コマンドでデータベースに接続し、以下のように入力します。

\i  mssqlcomp.sqlのパス

関数の登録に成功すると、以下にように表示されます。

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の開発で参考になる情報が公開されていますので、参照してみてはいかがでしょうか。

製品・サービスに関するお問い合わせ
03-5979-2701

お問い合せ受付時間 月 - 金 10:00 - 17:00

メールフォームでのお問い合わせ

ページトップへ