SQL Server Compact 3.5 を利用するアプリでの DB 構築と項目の追加(その3)

SQL Server Compact 3.5 を利用するアプリでの DB 構築と項目の追加(その2)」の続きです。前回で初期 DB 部分が完成したので、DB の構成変更への対応の部分になります。
まずは、「DB の構成変更部分を作る」です。

DB の構成変更ですが、Customers テーブルに「GroupId」項目を追加し、Products テーブルに「Price」項目を追加し、DB フォーマットのバージョンは 1.1 とすることにします。

テーブル名: Customers

列名 データ型 Null を許容 備考
CustomerId int 主キー
ID 列
CustomerName nvarvhar(50) 顧客名
GroupId int Version 1.1 で追加
DEFAULT 0

テーブル名: Products

列名 データ型 Null を許容 備考
ProductId int 主キー
ID 列
ProductName nvarvhar(50) 製品名
Price money Version 1.1 で追加
DEFAULT 0

新規項目にはデフォルト値を設定することにします。

DB の構成変更を行う DbAlter.cs を追加します。

using System;
using System.Data.SqlServerCe;

namespace ProductVupWithSdfTest003
{
    static internal class DbAlter
    {
        static public void Alter()
        {
            using (var connect = new SqlCeConnection(DbInit.ConnectionString))
            {
                connect.Open();
                try
                {
                    var dataVersion = "";
                    var selectStr = "SELECT DataVersion FROM Manages";
                    using (var command = connect.CreateCommand())
                    {
                        command.CommandText = selectStr;
                        var getDatas = command.ExecuteReader();
                        getDatas.Read();
                        dataVersion = getDatas.GetString(0);
                    }

                    if (dataVersion != "1.0")
                    {
                        throw new InvalidOperationException("データバージョンが '1.0' ではありませんでした。");
                    }

                    var sqlStr1 = "ALTER TABLE Customers " +
                                    "ADD GroupId int NOT NULL DEFAULT 0";
                    var sqlStr2 = "ALTER TABLE Products " +
                                    "ADD Price money NOT NULL DEFAULT 0";
                    var VersionUpdate = "UPDATE Manages SET DataVersion = '1.1' WHERE ManageId = 1";
                    using (var command = connect.CreateCommand())
                    {
                        command.CommandText = sqlStr1;
                        command.ExecuteNonQuery();
                        command.CommandText = sqlStr2;
                        command.ExecuteNonQuery();
                        command.CommandText = VersionUpdate;
                        command.ExecuteNonQuery();
                    }
                }
                finally
                {
                    connect.Close();
                }
            }
        }
    }
}

次に MainWindow.xaml.cs の BtnAlter_Click メソッドの処理を追加します。

//
        private void BtnAlter_Click(object sender, RoutedEventArgs e)
        {
            this.Cursor = Cursors.Wait;
            try
            {
                DbAlter.Alter();
                this.Cursor = Cursors.Arrow;
            }
            catch (InvalidOperationException ex)
            {
                MessageBox.Show(ex.Message, "DB 改版エラー", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            this.Cursor = Cursors.Arrow;
        }

これで DB の構成変更ができるので、実行して「追加設定」ボタンをクリックして DB の構成変更を行ったら終了させます。ここまでで「DB の構成変更部分を作る」は完了です。

次は「DBML ファイルをプロジェクトから削除した後、構成変更した DB から dbml ファイルを生成し、プロジェクトに追加する」です。テーブルに項目を追加しているので、変更後の DB 構成に対応した dbml ファイルにするために、sdf ファイルから dbml ファイルを再生成する必要があります。

まず、ソリューション エクスプローラーの TestDb.dbml を右クリックして、サブメニューから削除を選択します。確認ウィンドウが表示されるので OK ボタンをクリックして削除します。

次に、実行可能ファイルの生成フォルダ(Debug 構成では bin\debug)の TestDb.sdf ファイルから dbml ファイルを生成して、プロジェクトに追加します。手順はSQL Server Compact 3.5 を利用するアプリでの DB 構築と項目の追加(その2)での説明と同様なので省略します。

プロジェクトに追加したら(その2)のときと同様に TestDb.dbml ファイルを開いて、お約束の「テーブル名の複数形からクラス名の単数形化」を行います。また、Customer クラスに GroupId プロパティが、Product クラスに Price プロパティが追加されていることを確認してください。ここまでで「DB の構成変更部分を作る」は完了です。

次は「機能追加のコードを実装する」です。現在のプログラムだと変更が必要になるのは MainWindow.xaml.cs の顧客一覧の表示と顧客追加の部分です。

//
        private void BtnGetCustomer_Click(object sender, RoutedEventArgs e)
        {
            this.Cursor = Cursors.Wait;

            var temp = new StringBuilder();
            _service.FindCustomers().ForEach(n =>
            {
                temp.AppendFormat("{0}: {1}, {2}\r\n", n.CustomerId, n.CustomerName, n.GroupId);
            });
            this.TbkResult.Text = temp.ToString();

            this.Cursor = Cursors.Arrow;
        }

        private void BtnAddCustomer_Click(object sender, RoutedEventArgs e)
        {
            this.Cursor = Cursors.Wait;

            var customer = new Customer
            {
                CustomerName = "追加顧客2",
                GroupId = 1
            };
            _service.AddCustomer(customer);

            this.Cursor = Cursors.Arrow;
        }

これで DB 構成の変更を行ったプログラムが完成です。「顧客情報追加」ボタンをクリックしてから「顧客情報取得」ボタンをクリックすると次のように表示されます。

実際のアプリケーションを作る際には、起動時に DB フォーマットのバージョンを確認して、古いものだった場合には適切に最新のフォーマットにしてからサービスを始めることになるでしょう。

また、アプリケーションの配布を行う場合には、TechNet ライブラリの記事が参考になります。


SQL Server Compact 3.5 を利用するアプリでの DB 構築と項目の追加(その3)」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です