- PR -

DataRowCollectionについて

1
投稿者投稿内容
キャミ
会議室デビュー日: 2006/09/22
投稿数: 6
投稿日時: 2006-10-31 14:23
初歩的な質問ですが、書込みさせて頂きます。

DataSetでは、以下の通りにインスタンス生成出来ますが、

DataSet AA = new DataSet();

DataRowやDataRowCollection はインスタンス生成することが出来ません。
どういった理由からなのでしょうか?

DataRowCollection AA = new DataRowCollection();

よろしくお願いします。

.NET Framework v1.1(C#)
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-31 14:48
DataRowCollectionについてはドキュメントにコンストラクタの説明がないので、
コンストラクタ自体公開されていない(Publicになっていない)のかな?
この場合インスタンスを生成することはできませんね。

DataRowの場合は引数にDataRowBuilderクラスを渡せばインスタンスの生成は
できるのでしょうけど、ドキュメントに「コードから直接使用するためのもの
ではありません」と記述がありますから、利用しないほうがよいでしょう。
通常はDataTable.NewRowとかで新規行のインスタンスを作成しますね。
キャミ
会議室デビュー日: 2006/09/22
投稿数: 6
投稿日時: 2006-10-31 15:18
どっとねっとふぁんさん、ありがとうございます。


このような関数があります。

用途:テーブル情報(DB)を取得し、DataRowCollectionで返す
内容:引数でref渡しにしたDataRowCollection型の変数に対して、関数内で取得した情報を引数のDataRowCollection型変数に設定する

この関数の直前で空のDataRowCollectionを渡してあげて情報を取得したかったのですが、どっとねっとふぁんさんのお返事では「この作りは良くない」ということになりますよね?

実際、空で渡すと「未割り当ての〜」とコンパイルエラーが出ますので、他で取得している共有のstaticなDataRowCollection型変数を代入でコピーしていましたが、関数内部で引数のDataRowCollection型変数を初期化(.clear())してるタイミングで、共有側の変数も消去されました。(DataRowCollectionが参照型のためでした・・・)

コード:
呼び元
DataRowCollection drc_aa = drc_AA; // drc_AAは既に存在する変数
GetTable(ref drc_aa);

関数側
static int GetTable(ref drc_aa)
{
    drc_aa.clear(); // このタイミングでdrc_AAもクリアされる
           :
}



このような作りは再設計すべきでしょうか?
キャミ
会議室デビュー日: 2006/09/22
投稿数: 6
投稿日時: 2006-10-31 16:12
本来はDataSetを使った方が良いとは思いますが、既存処理の範囲が広いため今回はダミーのDataRowCollection型変数(初回だけ適当に小さなDBを読み込んだプログラム上全く関係ない変数の追加)を渡すようにしました。


どっとねっとふぁんさん、ありがとうございました。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-31 16:17
んと、通常DataTableを使う場面だと思います。
1.1だとシリアライズができないので、Webサービスでのデータのやりとりに
DataTableは使えませんが、関数間でのデータの受け渡しであれば十分利用可能かと。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2006-10-31 17:53
まず、refを使用する意味がありません。
値型・参照型、値渡し・参照渡しのそれぞれをしっかり理解しましょう。

次に、受け取ったDataRowCollectionに対してClearメソッドを使用していますが、あまりよろしくありません。
それなら、最初からDataRowCollectionにoutキーワードを付けてやって、メソッド内で生成しましょう。
#戻り値として返したい所ですが、見る限り、戻り値で処理結果コードか何かを返してるみたいなんで。

で、「DataRowCollectionはコンストラクタを公開していないから生成できないよ」ということになると思います。
DataRowCollectionのコンストラクタが公開されていないのは、DataRowCollectionが必ずDataTableによって作られ、そのDataTableと共に生滅するものだからです。DataRowCollectionの内部からも、DataTableへとアクセスします。
ということで、DataRowCollectionではなく、DataTableを扱うようにしましょう。

引用:
他で取得している共有のstaticなDataRowCollection型変数を代入でコピーしていました


引用:
DataRowCollection型変数(初回だけ適当に小さなDBを読み込んだプログラム上全く関係ない変数の追加)


いまいちよくわからないのですが、読み込んだデータも全く関係のないデータなのですか?
どちらにせよ、変数は使いまわしせず(グローバル変数は使わず)、必要な時に生成し、適切な責務を持たせましょう。
1

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