- PR -

DataTableの列の順番

1
投稿者投稿内容
ハヤ
常連さん
会議室デビュー日: 2003/06/04
投稿数: 41
投稿日時: 2003-07-16 10:06
DataTableからデータをデータを取得するとき、データを入力した順番で
取得できると考えてよいのでしょうか?それとも、DataViewでソートして
取得しないといけないのでしょうか?

コード:
DataTable dt;
dt.rows[0]["clm"] = "0001";
dt.rows[1]["clm"] = "0002";
dt.rows[2]["clm"] = "0003";
dt.rows[3]["clm"] = "0004";

上記のように設定したDataTableを
for(int i=0;dt.rows.Count;i++)
{
  string strHoge = dt.rows[i]["clm"].ToString();
}
でループして取得した場合に入力した順番に取得できるのか?
という事なんです。



実際にやってみると、ちゃんと入力した順番に取れるのですが、
これは保障されている動きなんでしょうか?
ハヤ
常連さん
会議室デビュー日: 2003/06/04
投稿数: 41
投稿日時: 2003-07-16 10:38
ちょっと追加させて下さい。

DataTableが、配列の塊と考えると、並び順は保障されていると考えられますし、
データベースのテーブルと考えると、並び順は保障されていないと考えられます。

それで迷っているわけです。
ハヤ
常連さん
会議室デビュー日: 2003/06/04
投稿数: 41
投稿日時: 2003-07-17 10:28
書き方を変えて質問をさせてください。
DataTableの配列は、格納順なのでしょうか?それとも一般のデータベースのテーブルと
同じく、行の順番は全く保障されないのでしょうか?

下にコードを揚げさせていただきました。
まず、DataTableを作成して、その中にデータ[0,1,2,3,4]をこの順番で5レコード追加
します。このデータを格納した順番に取得したいと考えているのですが、
<1>DataTableオブジェクトをループさせて取得の方法で取得した場合、下のコードで
は必ず、[0,1,2,3,4]の順番でデータは取得できます。

ただ、上記で述べたように行の順が保障されないのであれば、<2>一度、DataViewオブ
ジェクトでソートをかけてからループで取得の方法で行う必要が発生するのではないかと
考えております。できれば、やりたくないのです。


コード:
DataTable dt = new DataTable();          //テーブルを作成する
DataRow dr;
dt.Columns.Add("cd"    ,typeof(int));    //int型のカラムcdを作成

//0,1,2,3,4の順で、テーブルに入れる
for(int i=0;i<5;i++)
{
  dr = dt.NewRow();
  dr["cd"] = i;
  dt.Rows.Add(dr);
}

//<1>DataTableオブジェクトをループさせて取得
for(int i=0;i<dt.Rows.Count;i++)
{
  Debug.WriteLine(dt.Rows[i]["cd"].ToString());
  //0,1,2,3,4で取得できる
}

//<2>一度、DataViewオブジェクトでソートをかけてからループで取得
DataView dv = new DataView(dt,"cd<>-1","cd",DataViewRowState.CurrentRows);
for(int i=0;i<dv.Count;i++)
{
  Debug.WriteLine(dv[i]["cd"].ToString());
  //0,1,2,3,4で取得できる
}



#日経BPのプログラミングADO.NETを買って読んでみました。とてもよい本だと思いま
#したが、残念ながらこの件に関する記述は見つけられませんでした。ヘルプが分かり
#にくい状況でADO.NET関連のドキュメントが少ないのはきつく感じたりします。

すみませんが、アドバイスを頂けたら幸いです。
未記入
ベテラン
会議室デビュー日: 2003/06/26
投稿数: 76
投稿日時: 2003-07-17 11:07


[ メッセージ編集済み 編集者: 未記入 編集日時 2007-01-19 21:59 ]
ハヤ
常連さん
会議室デビュー日: 2003/06/04
投稿数: 41
投稿日時: 2003-07-17 12:47
ぜうすさん、こんにちは。

>どう見ても投入したデータをiというインデックスで入れた
>順番に取得しているようにしか見えないのですが...。
私にもそうみえるんです。。。

ただ、データベース(Access,SQLServer,Oracle)にレコードを追加しても
レコードの順番は特にクラスター化しない限りは保持されないじゃないですか?
それと同じ事が、DataTableでも起こりうる?と杞憂?してしまっている訳です。

>回答は、「取得しようとする順番に値は帰ってきます」

なんだかすごく馬鹿らしい事を聞いていた気もするのですが・・・
つまり、DataTableにインデックス1でいれたDataRowは、インデックス0
が削除されない限り、インデックス1のままですよねって、事なんです。

#DataSetをデータベースと同じように考えてしまう事が混乱の元
#だったように思います。
1

スキルアップ/キャリアアップ(JOB@IT)