|
ぶなっぷ さん
ご回答ありがとうございます。
あいまいな質問になってしまって申し訳ありません。 テストコードを下記に貼り付けますので、 ご確認頂ければと思います。
> 前提条件は、リレーションのはられたテーブルがあって、 > 主テーブルから外部キーで副テーブルの主キーにつながってると。 > で、副テーブル側のデータをソートした状態で取得したいと、 > もちろん重複なしで。 > そんなところかな?
はい。イメージはあっています。
> そうだと仮定するなら、プログラミングでどうにかするのは処理速度的に > 不利です。SQLに任せた方が良いです(そのためのDBです)。
ここがちょっと違いまして、今回はDBを使用せずに、 上記のことを実現したいと思っています。
下記がテストコードになります。 下の方にある row.GetChildRows("relationKey") の戻り値となる DataRow[] の設定順がなんの順なのかが知りたいです。
ここから============================================================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace WindowsFormsApplication4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { // 親テーブルを定義 DataTable parentTable = new DataTable(); parentTable.TableName = "parentTable"; parentTable.Columns.Add("Key", typeof(System.Int32)); parentTable.Columns.Add("ParentName", typeof(System.String)); parentTable.PrimaryKey = new DataColumn[] { parentTable.Columns["Key"] };
// 子テーブルを定義 DataTable childTable = new DataTable(); childTable.TableName = "childTable"; childTable.Columns.Add("Key", typeof(System.Int32)); childTable.Columns.Add("SubKey", typeof(System.Int32)); childTable.Columns.Add("ChildName", typeof(System.String)); childTable.PrimaryKey = new DataColumn[] { childTable.Columns["Key"], childTable.Columns["SubKey"] };
// レコードの追加 親レコード1件につき、子レコード20件作成 最終的に 親レコード10件 子レコード200件作成 for (int i = 1; i <= 10; i++) { // 親レコード追加 DataRow parentRow = parentTable.NewRow(); parentRow["Key"] = i; parentRow["ParentName"] = string.Concat("parent name ", i); parentTable.Rows.Add(parentRow);
// 子レコード追加 for (int j = 1; j <= 20; j++) { DataRow childRow = childTable.NewRow(); childRow["Key"] = i; childRow["SubKey"] = j; childRow["ChildName"] = string.Concat("child name ", i, " - ", j); childTable.Rows.Add(childRow); } }
// DataSetに親テーブル・子テーブルを追加し、双方のKeyフィールドでリレーションを張る DataSet tables = new DataSet(); tables.Tables.Add(parentTable); tables.Tables.Add(childTable); tables.Relations.Add(new DataRelation("relationKey", parentTable.Columns["Key"], childTable.Columns["Key"]));
// 親テーブル・子テーブルの内容をテキストファイルに書き込み using (System.IO.StreamWriter writer = new System.IO.StreamWriter(@"D:\Temp\TestDataTable.txt")) { foreach (DataRow row in parentTable.Rows) { // 親テーブルのレコードをテキストファイルに出力 writer.WriteLine(string.Format("{0} {1}", row["Key"], row["ParentName"])); // このrow.GetChildRowsで帰ってくる DataRow[] の並び順は?? // 雰囲気的には登録順だけど保証されている?? // 子テーブルに操作(レコードの削除・レコードの追加・PKの変更など)を加えたときも登録順が保証されている? foreach(DataRow row2 in row.GetChildRows("relationKey")){ // 子テーブルのレコードをテキストファイルに出力 writer.WriteLine(string.Format("\t{0} {1} {2}", row2["Key"], row2["SubKey"], row2["ChildName"])); } writer.WriteLine(); } } } } } ここまで==============================================================
以上です。 よろしくお願いします。
|