2011-11-08 2 views
0

SQL 데이터베이스에서 값을 반환하려고합니다. 그러나 다음과 같은 메서드를 실행할 때마다 "InvalidCastException 처리되지 않았습니다 개체를 DBNull에서 다른 형식으로 캐스팅 할 수 없습니다."라는 오류가 발생합니다.SQL 데이터베이스에서 단일 값을 반환 할 때 C# InvalidCastException이 발생했습니다.

빛을 비추면 어떤 빛이라도 크게 받아 주실 수 있습니다. 내가 사용하는 방법은 다음과 같습니다.

감사합니다. 쿼리가 (.NET에서 DbNull 것) null을 반환 - 오류 메시지가 분명하다 같은

public static int ScrapTotal2(string prdTypeV, string startDateV, string prtCodeV) 
    { 
     int scrapTotal2; 

     SqlParameter prdType = new SqlParameter("@prdType", SqlDbType.VarChar); 
     prdType.Value = prdTypeV; 
     SqlParameter startDate = new SqlParameter("@startDate", SqlDbType.VarChar); 
     startDate.Value = startDateV; 
     SqlParameter prtCode = new SqlParameter("@prtCode", SqlDbType.VarChar); 
     prtCode.Value = prtCodeV; 

     SqlCommand scrapTotal2SC = new SqlCommand("SELECT SUM([QTY_SCRP]) FROM [TBL_PRDMST] WHERE [PRD_CODE] LIKE @prdType AND [PRD_DATE] = @startDate AND [PRT_CODE] LIKE @prtCode", DataAccess.myConnection); 
     scrapTotal2SC.Parameters.Add(prdType); 
     scrapTotal2SC.Parameters.Add(startDate); 
     scrapTotal2SC.Parameters.Add(prtCode); 

     DataAccess.myConnection.Open(); 
     scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar()); 
     DataAccess.myConnection.Close(); 

     return scrapTotal2; 
    } 
+0

입니까? 먼저 DB에 체크인하십시오 – Pleun

+0

코드에 액세스 할 수 있으며 디버깅 할 수 있습니까? 어떤 라인이 예외를 던지고 있는지 우리에게 말할 수 있다면 좋을 것입니다. try-catch에 메서드 코드를 랩하면 유용한 정보를 얻을 수 있습니다. – AksharRoop

답변

3

SELECT 문은 NULL 값을 반환합니다. 당신은 첫 번째 null 인 경우 확인해야 :

object result = scrapTotal2SC.ExecuteScalar(); 
if (result == DBNull.Value) 
{ 
    /* write your code */ 
} 
else 
{ 
    scrapTotal2 = Convert.ToInt32(result); 
} 
+0

감사합니다. 나는 합계가 0이 아니고 널이 아닐 것이라고 잘못 추측했다. 이것은 훌륭하게 작동했습니다. – fanle

0

보인다.

정수는 값 유형이므로 null이 아니므로 Int32으로 변환 할 수 없습니다.

DbNull에 대한 반환 값을 확인하고 데이터 계층에서 기본 값을 반환하거나, null 반환되지 않음을 확인하기 위해 쿼리 및 데이터베이스를 확인 어느.

+0

하지만 convert.toInt32는 null을 0으로 변환합니다 ... –

+1

@RoyiNamir -하지만 'DbNull'을 '0'으로 변환하지 않습니다. 'DbNull! = null'. – Oded

+0

@RoyiNamir - 예, 'null'을 0으로 변환하지만 'DbNull'은 변환하지 않습니다. – Polynomial

0

일부 SQL 서버는 빈리스트의 합계가 null 생각하지 0 그래서 당신은 자신을 int로 널 (null)에서 변환을 처리해야합니다. 쿼리의 결과를 int로 직접 변환하지 않습니다.

scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar()); 

당신이 데이터베이스에 NULL을 얻을, 그것은 캐스팅됩니다

0

는 지정하지 않았기 때문에, 나는이 라인은 문제가 있음을 가정하는거야 scrapTotal2 = Convert.ToInt32(((string)scrapTotal2SC.ExecuteScalar()));

1

시도 코드에서 DBNull 형식으로. 이 유형은 Int32으로 전송할 수 없습니다.

이처럼를 확인할 수 있습니다

var obj = scrapTotal2SC.ExecuteScalar() 
if (obj == DBNull.Value) 
{ 
    // whatever logic you want to handle nulls 
} else { 
    scrapTotal2 = Convert.ToInt32(obj); 
} 
+0

죄송합니다. 어떤 라인에서 문제가 발생했는지 잊어 버렸습니다. 도와 주셔서 감사합니다. – fanle

0

반환 값이 NULL이고 당신이 할 수없는 ... INT 유형의 변수에 저장하려고하는 것을 때문에 오류 메시지는 .

은 아마 당신이 할 수있는 당신의 선택 반환 NULL 또는 유효한 값은 않습니다 ...

if(retval is null) then assign var = 0. 
+0

DBNull이 null과 같지 않습니다. OP는 retval == DBNull인지 확인해야합니다.값 –

+0

실제로, 나는 같은 것을 의미하지만 구문을 수집 할 수 없었기 때문에 psudeo 코드로 작성되었습니다. – Rahul

관련 문제