2012-05-13 15 views
0

データベースでこのコマンドを実行すると、結果がresult = nullになることがあります。これが起こったときに "else"部分を入力したいのですが、私が受け取りますデータベースからヌルを受け取ったときのエラー

mscorlib.dllで 'System.FormatException'という未処理の例外が発生しました。 追加情報:入力文字列が正しい形式ではありませんでした。

DB database = new DB(); 
      int reservedSeats = 0; 
      using (database.sqlConnection) 
      { 
       database.sqlConnection.Open(); 
       string command = "select SUM(nrLocuri) as result from Rezervari where idRand = @idRand and [email protected]"; 
       using (SqlCommand cmd = new SqlCommand(command, database.sqlConnection)) 
       { 
        cmd.Parameters.Add("@idRand", SqlDbType.Int).Value = idRand; 
        cmd.Parameters.Add("@idShow", SqlDbType.Int).Value = idShow; 
        using (SqlDataReader dr = cmd.ExecuteReader()) 
        { 
         if (dr.Read()) 
          if (dr["result"].ToString() != null) 
           reservedSeats = Convert.ToInt32(dr["result"].ToString()); 
          else 
           return totalSeats; 
        } 
       } 
      } 
      return totalSeats-reservedSeats; 
+0

あなたは例外処理をよく読んでする必要があります。 –

+0

列の結果のデータ型は何ですか? –

答えて

6

の代わりに:

if (dr["result"].ToString() != null) 

の操作を行います。

if (dr["result"] != DbNull.Value) 

dr["result"]がデータベースnullを返し、その値はDbNull.Valueです - あなたは、この値にConvert.ToInt32を呼び出すしようとすると、フォーマット例外が発生します。

+0

'DbNull'は' null'と同じですか? –

+0

@ ta.speot.is - いいえ、いいえ、そうではありません... – Oded

1

あなたはSUM()は、レコードが見つからなかった場合に0.00を返したい場合は、に置き換えます

COALESCE(SUM(...), 0.00) 

COALESCEは、それに渡された最初の非null値を返します。

1

isnullを試してみてください。

string command = "select isnull(SUM(nrLocuri),0.00)as result from Rezervari where idRand = @idRand and [email protected]"; 
+0

行がまったくない場合、これは機能しません – YvesR

2

試してみてください。

if(!dr.IsDBNull(i)){ //replace i with the column id 

    //get the data 

} 
+1

データアクセス層の序列に頼るべきではありません。 – Oded