2013-08-21 3 views
1

SqlCommandSum all payments for client입니다.하지만 지불에 문제가있는 곳은 null이거나 0입니다. 확실하지 않습니다. 하지만 여전히 동일한 예외가 발생합니다. 객체를 dbnull에서 다른 유형으로 캐스팅 할 수 없습니다.SqlCommand 결과 - dbnull에서 다른 유형으로 객체를 캐스팅 할 수 없습니다.

어떤 예외 또는 명령문으로 해결할 수 있습니까?

private void select_payments() 
    { 

     try 
     { 

      SqlCommand sc = new SqlCommand("SELECT SUM(payment) AS sumpayment FROM clientpayments WHERE subkey='" + selectid + "' AND year='" + selectedyear+ "'", con); 

      con.Open(); 
      int result = Convert.ToInt32(sc.ExecuteScalar()); 
      con.Close(); 

      if (result != 0) 
      { 
       Convert.ToDecimal(textBox20.Text = result .ToString().Replace(',', '.')); 
      } 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(" " + ex.Message.ToString()); 

     } 
    } 

나는 아직도이 예외를 수신하고 있습니다 :

목적은 내가이 낮은 품질의 문제 것을 알고 다른 종류의

에 DBNULL에서 캐스트 할 수없는하지만 난 아니에요

내가 어떻게이 문제를 해결할 수 있는지.

시간과 답변에 감사드립니다.

답변

5

두 가지 옵션이 있습니다. SQL 문 또는 변환을 수정하십시오. -

SQL 당신의 SUMISNULL에 랩 :

SELECT ISNULL(SUM(payment), 0) 

변환이 - 첫번째 DBNull.Value에 비교 :

var result = sc.ExecuteScalar(); 
int intResult = result == DBNull.Value ? 0 : Convert.ToInt32(result); 
+0

아마도 SELECT SUM (ISNULL (지불, 0)) ... 지불 아마도 어떤 식 으로든 정의에 NULL을 허용해야합니다. – rheitzman

2
object o = sc.ExecuteScalar(); 
con.Close(); 
if (o != null) 
{ 
    int result = (int) o; 
    if(result != 0) Convert.ToDecimal(textBox20.Text = result .ToString().Replace(',', '.')); 
} 
+0

않을까요'= O DBNull.Value' 및 null가 아닌. 따라서 동일한 오류가 발생합니까? – Khan

+0

@JefferyKhan 결과 집합이 비어 있으면 오류가 없습니다. 'null'이 반환됩니다. MSDN 페이지에 ** 반환 값 : 결과 집합의 첫 번째 행의 첫 번째 열 또는 결과 집합이 비어 있으면 null 참조 (Visual Basic의 경우 Nothing)입니다. ** ** –

관련 문제