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

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

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

Re[5]: DataTable の Cast


(過去ログ 42 を表示中)

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

■22035 / inTopicNo.1)  DataTable の Cast
  
□投稿者/ Melon (1回)-(2008/07/15(Tue) 10:54:26)

分類:[C#] 

はじめまして、宜しく御願い致します。

ある DataSet に「コード詳細マスタ」という DataTable を作成しました。
DBからレコードを取得して DataTable を参照渡しの引数で返却する共通のメソッドを作成し、実装しました。
このメソッドの DataTable の参照渡しに、インスタンス作成済みの「コード詳細マスタDataTable」の変数を
設定しましたが、

「最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。」

というコンパイルエラーが出てしまいます。
このメソッドは共通で使用したいので、引数の型を「コード詳細マスタDataTable」にするわけにはいきません。
(System.Data.DataTable)を変数の前に付加して Cast を試みたのですが、

ref または out 引数は、割り当て可能な変数でなければなりません。

というコンパイルエラーが出てしまいます。
何とかコンパイルを通す方法はあるのでしょうか。
御教授の程、宜しく御願い致します。

引用返信 編集キー/
■22043 / inTopicNo.2)  Re[1]: DataTable の Cast
□投稿者/ 黒龍 (107回)-(2008/07/15(Tue) 11:39:29)
DataTableの変数作ればOKだと思います。
DataTable a = table as DataTable;
としてキャスト済み変数にしてから渡せば。
引用返信 編集キー/
■22051 / inTopicNo.3)  Re[2]: DataTable の Cast
□投稿者/ Melon (2回)-(2008/07/15(Tue) 12:28:27)
No22043 (黒龍 さん) に返信
> DataTableの変数作ればOKだと思います。
> DataTable a = table as DataTable;
> としてキャスト済み変数にしてから渡せば。


御教授頂いた方法であれば、確かにコンパイルは通ると思います。
今回行いたい事は、DBのテーブルに合わせたDataTableを作成し、それで結果を受け取る事を想定しています。
上記方法で System.Data.DataTable の変数を宣言し、それをメソッドの引数に渡した場合、メソッド実行後に
System.Data.DataTable のレコード(DataRow)を「コード詳細マスタDataTable」に移し変える必要が生じてしま
います。
出来れば、それはしたくないと思っています。
引用返信 編集キー/
■22060 / inTopicNo.4)  Re[1]: DataTable の Cast
□投稿者/ シャノン (536回)-(2008/07/15(Tue) 14:04:17)
No22035 (Melon さん) に返信

返す DataTable のインスタンスをメソッド内で作成しているんですか?
インスタンスは呼び出し側で用意して、メソッドではそこにデータを埋めるようにすれば、ref / out は必要ありません。
引用返信 編集キー/
■22081 / inTopicNo.5)  Re[2]: DataTable の Cast
□投稿者/ Melon (3回)-(2008/07/15(Tue) 16:06:59)
No22060 (シャノン さん) に返信
> ■No22035 (Melon さん) に返信
>
> 返す DataTable のインスタンスをメソッド内で作成しているんですか?
> インスタンスは呼び出し側で用意して、メソッドではそこにデータを埋めるようにすれば、ref / out は必要ありません。


「selectCodeDetailMaster」というメソッド内で
「selectRecordFromSQL」という共通メソッドを実装しています。

「selectCodeDetailMaster」メソッド内で「コード詳細マスタDataTable」の変数を宣言し、インスタンスを作成して
「selectRecordFromSQL」の引数に設定しています。

「selectRecordFromSQL」の引数の型は「System.Data.DataTable」なので、

「最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。」

というコンパイルエラーが出てしまいます。
ちなみに、「selectRecordFromSQL」の引数の型を「コード詳細マスタDataTable」に変更すると、コンパイルは通り
DBからのレコード取得も正常に出来ます。

引用返信 編集キー/
■22082 / inTopicNo.6)  Re[3]: DataTable の Cast
□投稿者/ シャノン (538回)-(2008/07/15(Tue) 16:09:05)
No22081 (Melon さん) に返信
> 「selectCodeDetailMaster」というメソッド内で
> 「selectRecordFromSQL」という共通メソッドを実装しています。
>
> 「selectCodeDetailMaster」メソッド内で「コード詳細マスタDataTable」の変数を宣言し、インスタンスを作成して
> 「selectRecordFromSQL」の引数に設定しています。
>
> 「selectRecordFromSQL」の引数の型は「System.Data.DataTable」なので、
>
> 「最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。」
>
> というコンパイルエラーが出てしまいます。
> ちなみに、「selectRecordFromSQL」の引数の型を「コード詳細マスタDataTable」に変更すると、コンパイルは通り
> DBからのレコード取得も正常に出来ます。

selectRecordFromSQL の引数の型が「ref DataTable」になっているなら、単に「DataTable」にしてみてください。
引用返信 編集キー/
■22085 / inTopicNo.7)  Re[4]: DataTable の Cast
□投稿者/ Melon (4回)-(2008/07/15(Tue) 16:23:35)
No22082 (シャノン さん) に返信
> ■No22081 (Melon さん) に返信
>>「selectCodeDetailMaster」というメソッド内で
>>「selectRecordFromSQL」という共通メソッドを実装しています。
>>
>>「selectCodeDetailMaster」メソッド内で「コード詳細マスタDataTable」の変数を宣言し、インスタンスを作成して
>>「selectRecordFromSQL」の引数に設定しています。
>>
>>「selectRecordFromSQL」の引数の型は「System.Data.DataTable」なので、
>>
>>「最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。」
>>
>>というコンパイルエラーが出てしまいます。
>>ちなみに、「selectRecordFromSQL」の引数の型を「コード詳細マスタDataTable」に変更すると、コンパイルは通り
>>DBからのレコード取得も正常に出来ます。
>
> selectRecordFromSQL の引数の型が「ref DataTable」になっているなら、単に「DataTable」にしてみてください。


御指示の通り、引数の DataTable の前に付加していた ref を削除しましたら、コンパイルエラーは出なくなりました。
DBからのレコード取得も正常に出来ました。
大変助かりました。有難う御座います。

引用返信 編集キー/
■22101 / inTopicNo.8)  Re[5]: DataTable の Cast
□投稿者/ シャノン (539回)-(2008/07/15(Tue) 18:05:50)
No22085 (Melon さん) に返信

まだ見ていてくれることを祈りつつ補足します。
最初に言っとくべきだった。

.NET には、データ型自体に「値型」と「参照型」があります。
加えて、メソッドに引数を渡す方法として「値渡し」と「参照渡し」があります。
従って、「値型の値渡し」「値型の参照渡し」「参照型の値渡し」「参照型の参照渡し」という4通りが有り得ます。

C 言語の経験があれば、
「値型の値渡し」は「通常の値渡し」
「値型の参照渡し」と「参照型の値渡し」は「ポインタ渡し」
「参照型の参照渡し」は「ポインタのポインタ渡し」
に対応します。

DataTable は、型自体が参照型ですので、値渡し(ref をつけない)でも、C 言語で言うポインタ渡しと同等となり、呼び出し側で用意した変数に、呼び出された側で値をセットすることが可能です。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -