C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: コレクションについて


(過去ログ 95 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■57018 / inTopicNo.1)  コレクションについて
  
□投稿者/ TAKE (6回)-(2011/02/09(Wed) 09:33:46)

分類:[.NET 全般] 

C#についてわからないことがあります。

以下のような感じでDBからデータを取得してくるロジックがあるのですが
全レコードは itemsに格納されるのが理想なのですが
意図した結果になりません。


List<Test> items = new List<Test>(); //全レコード格納
Test item = new Test(); //一レコード格納
while (dr.Read())
{
item.Fill(dr);
items.Add(item);
} }


−−−−−−−−−−−−−−−−−−

public class Test {

public int Test_Id { get; set; }

public Test()
{
this.Test_Id = 0;
}

public Item Fill(SqlDataReader dr)
{
this.Test_Id = dr["Test_Id"];
return item;
}



データベース
Test_IDフィールド
AAA
BBB
CCC
と3件のレコードがあったとすると
最後に読み込んだCCCに
items[0]
items[1]
items[2]
すべてが置き換わってしまいます。

わかる方よろしくお願いいたします。

引用返信 編集キー/
■57019 / inTopicNo.2)  Re[1]: コレクションについて
□投稿者/ shu (420回)-(2011/02/09(Wed) 09:56:04)
No57018 (TAKE さん) に返信

> Test item = new Test(); //一レコード格納


> item.Fill(dr);
このまえに移動
引用返信 編集キー/
■57020 / inTopicNo.3)  Re[2]: コレクションについて
□投稿者/ TAKE (7回)-(2011/02/09(Wed) 10:10:26)
現象変わらずです・・・。
引用返信 編集キー/
■57021 / inTopicNo.4)  Re[3]: コレクションについて
□投稿者/ shu (421回)-(2011/02/09(Wed) 11:12:48)
No57020 (TAKE さん) に返信
> 現象変わらずです・・・。

while (dr.Read())
{
    Test item = new Test(); //一レコード格納
    item.Fill(dr);
    items.Add(item);
}

こうですが、だめです?

引用返信 編集キー/
■57024 / inTopicNo.5)  Re[4]: コレクションについて
□投稿者/ マサヤ (252回)-(2011/02/09(Wed) 11:49:11)
while (dr.Read())
{
Test item = new Test(); //一レコード格納
  item.Test_Id = dr["Test_Id"];
items.Add(item);
}
これで駄目なら、原因がdrにあるのではないですか?
引用返信 編集キー/
■57025 / inTopicNo.6)  Re[4]: コレクションについて
□投稿者/ TAKE (8回)-(2011/02/09(Wed) 11:56:43)
駄目ですね。

そもそも
itemsに対して
Addで加えているだけなのに
加えた後のデータが後で変わってしまうのが
不思議でしょうがないですね。

1レコード目読み込み
items[0] AAA

2レコード目読み込み
items[0] BBB
items[1] BBB

3レコード目読み込み
items[0] CCC
items[1] CCC
items[2] CCC

引用返信 編集キー/
■57026 / inTopicNo.7)  Re[5]: コレクションについて
□投稿者/ マサヤ (253回)-(2011/02/09(Wed) 12:46:19)
2011/02/09(Wed) 12:47:23 編集(投稿者)

ちょっと強引ですが、これではどうですか?

public class Test {

private int test_Id;

public Test(_test_Id)
{
test_id = _test_Id
}
public int Test_Id
{
get{return test_Id}set{test_Id = value}
}
}
///////////////////////////////////////////////////////////
List<Test> items = new List<Test>(); //全レコード格納

while (dr.Read())
{
Test item = new Test((int)dr["Test_Id"].Tostring); //一レコード格納
items.Add(item);
}
引用返信 編集キー/
■57027 / inTopicNo.8)  Re[6]: コレクションについて
□投稿者/ TAKE (9回)-(2011/02/09(Wed) 13:04:49)
上手くいきました。
ありがとうございます。
私の方でもいろいろ試していて上手くいきました。


下記のようにしました。



public item Fill(SqlDataReader dr)
{
Test item = new Test();
item.Test_Id = (誰かのライブラリ)(dr["Test_Id"]);
return item;
}


C#で参照渡しの特異な形があるのかと思っていましたが
どうやら(誰かのライブラリ)が悪さしているのかもしれません。
ライブラリの中をのぞくことはできないのが残念です。(メタデータ)


引用返信 編集キー/
■57030 / inTopicNo.9)  Re[7]: コレクションについて
□投稿者/ shu (422回)-(2011/02/09(Wed) 13:32:15)
No57027 (TAKE さん) に返信

> public item Fill(SqlDataReader dr)
> {
> Test item = new Test();
> item.Test_Id = (誰かのライブラリ)(dr["Test_Id"]);
> return item;
> }

この修正だけで動くようになるのは不思議です。whileループ側も修正されていませんか?
引用返信 編集キー/
■57031 / inTopicNo.10)  Re[8]: コレクションについて
□投稿者/ TAKE (10回)-(2011/02/09(Wed) 14:05:09)
No57030 (shu さん) に返信
> ■No57027 (TAKE さん) に返信
>
>>public item Fill(SqlDataReader dr)
>>{
>> Test item = new Test();
>> item.Test_Id = (誰かのライブラリ)(dr["Test_Id"]);
>> return item;
>>}
>
> この修正だけで動くようになるのは不思議です。whileループ側も修正されていませんか?

しています。itemに一度渡しています。

item = item.Fill(dr);
items.Add(item);

引用返信 編集キー/
■57045 / inTopicNo.11)  Re[9]: コレクションについて
□投稿者/ shu (426回)-(2011/02/09(Wed) 17:07:21)
No57031 (TAKE さん) に返信
> ■No57030 (shu さん) に返信
>>■No57027 (TAKE さん) に返信
>>
> >>public item Fill(SqlDataReader dr)
> >>{
> >> Test item = new Test();
> >> item.Test_Id = (誰かのライブラリ)(dr["Test_Id"]);
> >> return item;
> >>}
>>
>>この修正だけで動くようになるのは不思議です。whileループ側も修正されていませんか?
>
> しています。itemに一度渡しています。
>
> item = item.Fill(dr);
> items.Add(item);

これだとNo57021と同じ処理になる気がするんですが、不思議ですね。

引用返信 編集キー/
■57046 / inTopicNo.12)  Re[10]: コレクションについて
□投稿者/ TAKE (14回)-(2011/02/09(Wed) 17:21:36)
Fillを呼び出す側のitemと
Fill内のitemは別個になるので
処理的に変わると思いますよ。
引用返信 編集キー/
■57052 / inTopicNo.13)  Re[11]: コレクションについて
□投稿者/ shu (427回)-(2011/02/09(Wed) 22:17:36)
No57046 (TAKE さん) に返信
> Fillを呼び出す側のitemと
> Fill内のitemは別個になるので
> 処理的に変わると思いますよ。
Fillの戻りを代入しているのでFillを呼ぶ前のitemとFill内のitemは異なりますが
Fillの後は同じになります。
さらに両方を展開して整理するとマサヤさんのNo57024と同じ処理になります。

というのが通常の動作かと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -