2017-02-15 32 views
2

私はint型のデータベースフィールドを持っています。 私はこれを試してみる:文字列に変換せずにDataRowからint値を取得する

int val = Convert.ToInt32(row["Int_Field_Name"].ToString()); 

それは動作します。

しかし、これは非常に悪くて効果がありません。

私はこれらを試してみました:よりエレガントでより効果的な方法はあり 指定されたキャストは

有効ではありません。

int val = row.Field<int>("Int_Field_Name"); 
int val = (int)row["Int_Field_Name"]; 

しかし、彼らは例外をスロー?

+1

'Convert.ToInt32(row [" Int_Field_Name "])'? –

+0

「これは非常に悪くて効果がありません」とはどういう意味ですか? – A3006

+0

私はそれが文字列に最初に変換する意味がないことを意味し、それは乱雑に見えます。 –

答えて

2

に依存それらはobjectです。その理由は、基礎となるプロバイダがデータ型を決定するからです。たとえば、基礎となるデータがあるデータベースから来ている場合、、uintulongまたはlong、さらにはDBNull.Valueの値になる可能性があります。したがって、完全に安全であるためにはConvert.To*メソッドファミリを使用する必要があります。

しかし、ほとんどの場合、あなたが行う必要のないことの1つは、ToStringです。変換関数は、変換可能な場合は、値をうまく変換します。コンバーチブルでは、int.MaxValueより大きい値をlongの値をintに変換しようとすると、たとえば失敗することになります。

だからあなたの最善の策は、あなたが(私はあまりにもビットを行う)この醜いを感じた場合は

public static int GetInt(this DataRow row, string fieldName) { 
    return Convert.ToInt32(row[fieldName]); 
} 

のように、あなたが拡張メソッドを導入することができ

Convert.ToInt32(row["Int_Field_Name"]) 

を使用してmyRow.GetInt("Int_Field_Name")ように使用されます。もちろん、いくつかのチェックで、おそらくフォールバック値などで、この拡張機能をより堅牢にすることができます。

+0

明確かつ十分に説明された回答をいただきありがとうございます。 –

1

試してみてください。

int q = Convert.ToInt32(row["Int_Field_Name"]); 

ToInt16と64もある、問題はDataTableのようなADOクラスのほとんどは弱い型付けされているということですので、あなたが直接から抽出することができ、すべての必要なもの

関連する問題