ホーム - 業務アプリ - リストデータモデル

リストデータモデル

YWorks Software Framework(以下、YWSFと呼びます)では、リスト形式のデータを取り扱うモデルとしてYCDbListクラスを用意しています。YWSFではリスト形式のデータを必要とする場合、YCDbListクラスを継承して個々のサブクラスを作成します。リスト形式のデータは通常は参照用でデータの変更(保存)をしないものを想定していますが、変更(保存)可能なリストを作ることも可能です。

YCDbListのサブクラスでは、まずデータ取得用のSELECT文(SQL)を記述するためにMakeSQLSelectメソッドをオーバーライド(サブクラスでの実装です)します。例としては下記のようになります。

protected override string MakeSQLSelect(System.Data.Common.DbParameterCollection parameters)
{
    string ans = "SELECT Mユーザグループ.ユーザグループコード, Mユーザグループ.ユーザグループ名";
    ans += ", Mユーザグループ.プライオリティ";
    ans += ", Mユーザグループ.管理者フラグ, Mユーザグループ.ゲストフラグ";
    ans += ", Mユーザグループ.削除フラグ";
    ans += " FROM Mユーザグループ";
    ans += " ORDER BY Mユーザグループ.プライオリティ;";

    return ans;
}
				


上記はMユーザグループというテーブルに登録されているデータを取得するためのSELECT文の例です。結果として複数の行(レコード)を取得できます。もし、このリストを変更(追加・更新・削除)が可能にするためにはAllowSaveプロパティをオーバーライドします。記述方法は下記のとおりです。

				
public override bool AllowSave
{
    get
    {
        return true;
    }
}
				


YCDbListにおいては、AllowSaveはデフォルトでfalseを返すようになっています。

リストの変更を許す場合に、新規行を追加されるときに通常は各データ項目はNullが初期値に設定されます。もし、各データ項目の初期値が必要な場合(特にフラグの項目)はInitializeNewRowメソッドをオーバーライドします。下記に例を示します。

protected override void InitializeNewRow(System.Data.DataRow newRow)
{
    newRow["プライオリティ"] = 1;
    newRow["管理者フラグ"] = 0;
    newRow["ゲストフラグ"] = 0;
    newRow["削除フラグ"] = 0;
}
				


また、変更に使われるSQL文(INSERT文、UPDATE文、DELETE文)は通常SELECT文から自動的に作られますが、複数のテーブルを参照しているような場合などには自動生成によるSQL文では不都合な場合もあります。このような場合は自動生成SQLを使わずに個別に記述することも可能です。まずAutoSQLプロパティをオーバーライドしてfalseを返すように記述してください。次に変更用SQL作成メソッド(MakeSQLInsertメソッド、MakeSQLUpdateメソッド、MakeSQLDeleteメソッド)をそれぞれオーバーライドしてください。変更用SQL作成メソッドには引数にパラメータコレクションが渡されますので、メソッド内でSQL文に合わせて追加してください。変更用SQL作成メソッドの下記にサンプルを示します。

//Select文からInsert文、Update文、Delete文を自動生成する機能をストップ
protected override bool AutoSQL
{
    get
    {
        return false;
    }
}

//INSERT文
protected override string MakeSQLInsert(System.Data.Common.DbParameterCollection parameters)
{
    string ans = "INSERT INTO Mユーザグループ (";
    ans += "ユーザグループコード, ユーザグループ名, プライオリティ";
    ans += ", 管理者フラグ, ゲストフラグ, 削除フラグ";
    ans += ") VALUES (";
    ans += "@ユーザグループコード, @ユーザグループ名, @プライオリティ";
    ans += ", @管理者フラグ, @ゲストフラグ, @削除フラグ";
    ans += ");";

    //コマンドパラメータの設定
    YCDbHelper.AddParameter(this.Connection, parameters, "@ユーザグループコード", DbType.String, 5).SourceColumn = "ユーザグループコード";
    YCDbHelper.AddParameter(this.Connection, parameters, "@ユーザグループ名", DbType.String, 50).SourceColumn = "ユーザグループ名";
    YCDbHelper.AddParameter(this.Connection, parameters, "@プライオリティ", DbType.Int32).SourceColumn = "プライオリティ";
    YCDbHelper.AddParameter(this.Connection, parameters, "@管理者フラグ", DbType.Int32).SourceColumn = "管理者フラグ";
    YCDbHelper.AddParameter(this.Connection, parameters, "@ゲストフラグ", DbType.Int32).SourceColumn = "ゲストフラグ";
    YCDbHelper.AddParameter(this.Connection, parameters, "@削除フラグ", DbType.Int32).SourceColumn = "削除フラグ";

    return ans;
}

//UPDATE文
protected override string MakeSQLUpdate(System.Data.Common.DbParameterCollection parameters)
{
    //主キー(ユーザグループコード)は変更しないこととします。
    string ans = "UPDATE Mユーザグループ SET";
    ans += " ユーザグループ名 = @ユーザグループ名";
    ans += ", プライオリティ = @プライオリティ";
    ans += ", 管理者フラグ = @管理者フラグ";
    ans += ", ゲストフラグ = @ゲストフラグ";
    ans += ", 削除フラグ = @削除フラグ";
    ans += " WHERE ユーザグループコード = @ユーザグループコード;";

    //コマンドパラメータの設定
    YCDbHelper.AddParameter(this.Connection, parameters, "@ユーザグループコード", DbType.String, 5).SourceColumn = "ユーザグループコード";
    YCDbHelper.AddParameter(this.Connection, parameters, "@ユーザグループ名", DbType.String, 50).SourceColumn = "ユーザグループ名";
    YCDbHelper.AddParameter(this.Connection, parameters, "@プライオリティ", DbType.Int32).SourceColumn = "プライオリティ";
    YCDbHelper.AddParameter(this.Connection, parameters, "@管理者フラグ", DbType.Int32).SourceColumn = "管理者フラグ";
    YCDbHelper.AddParameter(this.Connection, parameters, "@ゲストフラグ", DbType.Int32).SourceColumn = "ゲストフラグ";
    YCDbHelper.AddParameter(this.Connection, parameters, "@削除フラグ", DbType.Int32).SourceColumn = "削除フラグ";

    return ans;
}

//DELETE文
protected override string MakeSQLDelete(System.Data.Common.DbParameterCollection parameters)
{
    string ans = "DELETE FROM Mユーザグループ WHERE ユーザグループコード = @ユーザグループコード;";

    //コマンドパラメータの設定
    YCDbHelper.AddParameter(this.Connection, parameters, "@ユーザグループコード", DbType.String, 5).SourceColumn = "ユーザグループコード";

    return ans;
}				


YCDbListではコンストラクタとしてYCConnectionオブジェクトが必要になります。ですので、インスタンスを生成(new)する時には引数にYCConnectionオブジェクトを渡してください。通常はYCConnectionManager.Instance.Connectionをインスタンス生成時の引数に使用します。これはYCDbObjectにおいても同様です。
(例)
YCDbList list = new YCDbListSubClass(YCConnectionManager.Instance.Connection);
				


また、WriteToFileメソッドをオーバーライドしてリストデータをファイル出力することも可能です。WriteToFileメソッドの引数の記述にはいくつかありますが、YCFileオブジェクトを引数とするものをオーバーライドして下さい。(ファイルのオープンとクローズもそこで行って下さい。)下記に実装サンプルを示します。

//ファイル出力サンプル
public override void WriteToFile(YCFile file)
{
    try
    {
        if (this.RowCount < 1) return;

        file.Open();

        this.MoveFirst();
        while (!this.EOF)
        {
            string data = "\"" + YCConvert.ToString(this["ユーザID"]) + "\"";
            data += ",\"" + YCConvert.ToString(this["ユーザ名"]) + "\"";
            data += ",\"" + YCConvert.ToString(this["ユーザ名カナ"]) + "\"";
            data += ",\"" + YCConvert.ToString(this["パスワード"]) + "\"";
            data += ",\"" + YCConvert.ToString(this["ユーザグループ名"]) + "\"";
            data += "," + YCConvert.ToString(this["削除フラグ"]);

            file.WriteLine(data);

            this.MoveNext();
        }

        file.Close();
    }
    catch (Exception e)
    {
        if (file.IsOpened) file.Close();
        throw e;
    }
}