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






