2012-05-03 14 views
35

私はストアドプロシージャを実行しようとしているし、ifステートメントを使用してヌル値をチェックしようとしています。私はVBの男ですので、私は児童文法の誤りを作っている場合は私と一緒に裸をしてください。DBNull ifステートメント

objConn = new SqlConnection(strConnection); 
objConn.Open(); 
objCmd = new SqlCommand(strSQL, objConn); 
rsData = objCmd.ExecuteReader(); 
rsData.Read(); 

if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value))) 
     { 
      strLevel = rsData["usr.ursrdaystime"].ToString(); 

     } 

が、これはSQL接続は、単に値を返しているかどうかを私がチェックすることができますので、その後、私の文字列を取り込む場合でしょうか?

私はちょうど値が返され、ないにIsDBNull(rsData(「usr.ursrdaystime」なら、私はC#

で正しくそれをやっているかわからないされているかどうかを確認するには、以下をチェックすることができることに慣れています))

助けていただけたら幸いです!

+3

あなたは一つのセルを期待している場合は、 'ExecuteScalar' –

+0

は、あなたの質問のタイトルにプログラミング言語を置かないでください考える - それはタグがのためにあるものです。 –

+0

申し訳ありません - 将来の@DBMのために、それを注意します。 – PipBoy

答えて

58

これは動作するはずです。

if (rsData["usr.ursrdaystime"] != System.DBNull.Value)) 
{ 
    strLevel = rsData["usr.ursrdaystime"].ToString(); 
} 

も怒鳴るように、ステートメントを使用して追加する必要があります。

using (var objConn = new SqlConnection(strConnection)) 
    { 
     objConn.Open(); 
     using (var objCmd = new SqlCommand(strSQL, objConn)) 
     { 
      using (var rsData = objCmd.ExecuteReader()) 
      { 
       while (rsData.Read()) 
       { 
       if (rsData["usr.ursrdaystime"] != System.DBNull.Value) 
       { 
        strLevel = rsData["usr.ursrdaystime"].ToString(); 
       } 
       } 
      } 
     } 
    } 

これは自動に処分します(近い)リソースブロック{..}の外。

if(rsData["usr.ursrdaystime"] != DBNull.Value) { 
    strLevel = rsData["usr.ursrdaystime"].ToString(); 
} 

この:

rsData = objCmd.ExecuteReader(); 
rsData.Read(); 

は、あなたが1つの値を読んでいるように見えます

+0

usingステートメントは私の最初の接続文字列を置き換えますか? 私はそれが以下を置き換えると仮定しています。 objConn = new SqlConnection(strConnection); objConn.Open(); objCmd&rsdata文字列は引き続き使用しますか? – PipBoy

+0

私は、ステートメント(クローズ/ディスペース)を使用してコードを正しく編集しました。あなたはまだ**開かなければならない**接続 –

+0

私はこのインスタンスではこれが私のニーズに合うと思う - ありがとう! – PipBoy

9

慣用的な方法はと言うことです。代わりにIDbCommand.ExecuteScalarを使用してください。

2

はい、構文の問題です。代わりにこれを試してみてください:

if (reader["usr.ursrdaystime"] != DBNull.Value) 

.Equals()two Object instances are the sameかどうかを確認するためにチェックしています。

+1

それは条件の場合彼を連れて行きます。 '=='を '!='にする –

+0

はい、私はそれを投稿した後に気づきました。今修正されました。 – mgnoonan

2

は考えてみましょう:

if(rsData.Read()) { 
    int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime" 
    if(rsData.IsDBNull(index)) { 
    // is a null 
    } else { 
    // access the value via any of the rsData.Get*(index) methods 
    } 
} else { 
    // no row returned 
} 

また:あなたはusingより多くを必要とし、P

-1

最初の使用時には、ExecuteScalar

objConn = new SqlConnection(strConnection); 
objConn.Open(); 
objCmd = new SqlCommand(strSQL, objConn); 
object result = cmd.ExecuteScalar(); 
if(result == null) 
    strLevel = ""; 
else 
    strLevel = result.ToString(); 
2

あなたのVBに最も近い同等の(see this)のようになります。

Convert.IsDBNull() 

しかし、そこにこれを行うにはいくつかの方法があり、ほとんどがfrom here

0

リンクされている私は、多くの場合、String.IsNullorEmptyを使用。彼女はDBNullが.ToStringに設定されていると空を返しますので、彼女が機能します。

if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){ 
     strLevel = rsData["usr.ursrdaystime"].toString(); 
    }