リストデータモデル
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; } }