- PR -

C# SqlDataReaderで取得した値をカラム名で参照するには?

1
投稿者投稿内容
shinerecord
会議室デビュー日: 2008/04/09
投稿数: 2
投稿日時: 2008-04-09 22:16
初めて投稿させていただきます。

SqlDataReader sDR;
select Col from XXXX
int 変数 = (int)sDR["Col"]; <-- 「指定されたキャストは有効ではありません」でエラー
int 変数 = sDR.GetInt32(0); <-- これはOK

VB.NETでは(文法は違いますが)上のコードで値を取得できます。
C#ではこれ以外の方法はないのでしょうか?よろしくお願いします。

さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2008-04-09 23:05
さかもとと申します。

(int) というキャストは 数値型→数値型 と分かっている場合に有効です。
sDR["Col"](datareaderでフィールド名指定の場合)は型として何を返すのか調べてないのですが、おそらく数値型じゃないのでは。

sDR.GetInt32(0)がうまくいくのは Col を Int32型として○×型を明示的にキャストしているからうまくいき、VBで(int)sDR["Col"]に類する文がうまくいくのは暗黙の型変換を行っているからだと思います。

明示的に型変換をおこなう場合はint.Parseで。

追記:
文字列っぽいですね。
int.Parse(sDR["COL"].ToSting())でいけると思いますが、そもそも「COL」の型は分かっているはずなので、GetInt32のほうがすっきりしてて好きです。





_________________
------------------------------------------
拝啓、さかもとと申します。

拝啓、さかもとと申します♪

[ メッセージ編集済み 編集者: さかもと 編集日時 2008-04-09 23:27 ]

[ メッセージ編集済み 編集者: さかもと 編集日時 2008-04-09 23:28 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-04-10 00:03
C#ではsDR["Col"]で取得できます。(int)でキャストできないのはint型じゃないからでしょうね。
sDR["Col"].GetType()とかで型を見てみてください。DBの型が何かも気になりますね。

sDR["Col"]の戻り型はobjectなので、インスタンスの型がshortとかだったらキャストできません。
#この場合GetInt32でもキャストエラーになったけどなあ

>明示的に型変換をおこなう場合はint.Parseで。
文字列の場合はそうですね。shortとかだったらConvert.ToInt32あたりでしょうね。
shinerecord
会議室デビュー日: 2008/04/09
投稿数: 2
投稿日時: 2008-04-10 08:06
Shinerecordです。
この度は早速のアドバイス誠にありがとうございます。
レスの速さにびっくりしており、感謝感激でございます。
さて、本件のご質問の件、賢者の皆様にお詫びを申し上げなければなりません。

int 変数 = (int)sDR["Col"]; で正しく動作しました。

原因は私のコーディングミスでした。
情けない事に、sDR{0]はint型のカラムと思い込んでおりましたが、実際はstring型でした。
改めまして、アドバイスを頂いた皆様にお詫び申し上げます。

追伸
当たり前ですが、今後はよ〜く確認してからご質問させて頂きます。
ありがとうございました。
1

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