2011-08-17 6 views
12

私のプログラムでは、各フィールドからデータを取得するためにデータテーブルをループしています。私の1行のコードは次のようになります。intに変換する前にnullフィールドをゼロに変換しますか?

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); 

基本的に、私はちょうどセル内の値を取り、INT32に変換しています。しかし、フィールド内のデータがnullの場合、私は問題に遭遇します。 "DBNull"を別のタイプに変換できないというInvalid Castエラーメッセージが表示されます。

だから、私はこのような何かを行うことによって、それを変換しようとする前に、私はちょうどフィールドの値を確認することができることを知っている:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == null) 
      { 
       resultsDT.Rows[currentRow]["LYSMKWh"] = 0; 
      } 

をしかし、これを行うには良い方法はありますか? ifに頼らなくても値を変換しようとしている間に、「インライン」でできることはありますか?

編集:私は、この提案された方法を使用してみました:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0"); 

残念ながら、私はまだはDBNullタイプに関して不正なキャストのエラーメッセージを受信しました。それは私が問題を持つ可能性が示唆された??どちらかの側の型が異なる場合は演算子

また、データテーブルを構築しているデータを完全に制御できるため、null値がどのフィールドにも書き込まれないように変更しました。したがって、nullをint32に変換する必要はほとんどありません。この場合はint32に変換されます。すべてのアドバイス、みんなありがとう!

答えて

9

var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"]; 
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0; 
+0

これは実際に私のためにかなり良い仕事をした。私は以下の例を??私はまだ無効なキャストエラーメッセージを取得してしまった。 CodeNakedが下で述べたどのユーザーから、??いずれかの側の型が異なる場合。 – Kevin

3

nullの値をチェックするC#の??演算子を使用することを検討し、nullの場合はデフォルト値を割り当てます。それは代わりにnullDBNull.Valueだ場合

var LYSMKWh = 
    resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value) 
    ? 0 
    : Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); 
+4

例は 'INT LYSMKWh = Convert.ToInt32あろう作成し;' –

+0

がに落ち同じトラップ - resultsDt.Rows [...] [...]の型がint(または0から自動変換された任意の数値)の場合のみ - Convert.ToInt32は無意味です - 私はそれが文字列だと思います? – Carsten

+1

あなたは正しいのです。もしOPがデータベースの制御権を持っていれば、おそらく彼はそれをヌルを返すように設定し、コードの最初の部分を取り除いて(完全に取ってintに変換する)それはうまくいくはずです... –

0

チェック:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value) 
{ 
    resultsDT.Rows[currentRow]["LYSMKWh"] = 0; 
} 

三項式は次のように動作します:あなたはこれを行うことができます

5

は使用?オペレータ:

resultsDT.Rows[currentRow][...] ?? "0" 

(文字列であるためにフィールドを期待 - 「0」に変更しない場合)

0

あなたが使用することができます?オペレータ:あなたは三項演算子に置き換えることができ

object x = null; 

int i = (int)(x ?? 0) 
1

:また

var rowData = resultsDT.Rows[currentRow]["LYSMKWh"]; 
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0; 

??オペレータは仕事ができる:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0); 

しかし、私はそれが読みにくくだと思います。あなたは、文字列のように、他の種類を取るオーバーロードが必要な場合があります

public static int ConvertToInt32(object value, int defaultValue) { 
    if (value == null) 
     return defaultValue; 
    return Convert.ToInt32(value); 
} 

+0

私はあなたの2番目の例が好きです。私は決して使ったことがない??私はそれを調べることに興味があるでしょう。 – Kevin

+0

私の2番目の例は、0から 'int'への不必要な変換も行います。これは、パフォーマンス上の問題を引き起こすかもしれません。私はresultsDTからあなたが期待しているタイプがわからないので、文字列などを期待している場合は0の代わりに "0"を入れなければならないかもしれません。 –

2

は、カスタム変換メソッドを使用することができます。両側のタイプが異なる場合は、??オペレーターに問題がある可能性があります。

+0

私はこの答えが好きです。あなたは正しいのですが、私は問題を抱えていましたか?オペレータ(私は私のOPと同じエラーメッセージを受け取りました)。 – Kevin

0

拡張メソッドを使用できます。

int LYSMKWh = resultsDT.Rows[currentRow]["LYSMKWh"].IfNullThenZero(); 

(0 ?? resultsDT.Rows [currentRowの] [ "LYSMKWh"])以下のクラス

public static class Converter 
{ 
    public static Int32 IfNullThenZero(this object value) 
    { 
     if (value == DBNull.Value) 
     { 
      return 0; 
     } 
     else 
     { 
      return Convert.ToInt32(value); 
     } 
    } 
} 
関連する問題