2009-07-10 4 views
5

WHERE 문에서 null을 허용하도록 추가해야하는 코드.ExecuteScalar : 개체 참조가 설정되지 않은 경우

{ 
    int numApprovals = 0; 
    string sql = "SELECT COUNT(Type) AS OpenforApproval " + 
     "FROM dbo.LeaveRequest " + 
     "WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) " + 
     "GROUP BY MgtApproval " + 
     "HAVING MgtApproval IS NULL"; 
     //"SELECT COUNT(EffectiveDate) AS OpenforApproval FROM LeaveRequest GROUP BY TimeStampApproval HAVING (TimeStampApproval IS NULL)"; 

    using (cn = new SqlConnection(ConnectionString())) 
    { 
     cn.Open(); 
     using (cmd = new SqlCommand(sql, cn)) 
     { 
      cmd.CommandType = CommandType.Text; 
      numApprovals = (int)cmd.ExecuteScalar(); 
     } 
    } 

    return numApprovals; 
} 
+0

당신이 더 나은 제목을 적어주세요 수 있습니다 문제? 이것은 매우 일반적입니다. –

+0

미안 알렉스, 다음 번에 더 나은 베지 테를 할거야. – Yves

답변

12

그냥 :

WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) OR Type IS NULL 

하지만 전혀 확신 즉 당신이 정말로 원하는, 또는 문제의 원인 아니에요.

C# 코드에서 예외가 발생하는 경우 where 절에서 예외가 발생하지 않습니다.

연결이 기존 변수를 재사용하고있는 것 같습니다. 나쁜 생각. 거의 확실하게 지역 변수가되어야합니다. 또한 그것의 중간에서 반환하여 코드를 간단하게 할 수 있습니다 문제가있는 경우 제이미가 말한대로 ExecuteScalar는이 null을 반환하는 것으로,

string sql = ...; 

using (var cn = new SqlConnection(ConnectionString())) 
{ 
    cn.Open(); 
    using (cmd = new SqlCommand(sql, cn)) 
    { 
     cmd.CommandType = CommandType.Text; 
     return (int) cmd.ExecuteScalar(); 
    } 
}  

, 그 둘레에 얻을 수있는 가장 쉬운 방법은 널 (NULL)에 캐스팅하는 것입니다 int를 사용하고 null 병합 연산자를 사용하십시오.

return (int?) cmd.ExecuteScalar() ?? 0; 
+0

sqlexception : 'nullgroup'근처의 구문을 incoreect합니다. "IN 유형 (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) OR 유형이 NULL 인 경우"+ "GROUP BY MgtApproval"+ – Yves

+0

" ". –

+0

즉, "... IS NULL"+ "GROUP BY ..."가 있어야합니다 (또는 이것을 쉽게하기 위해 축 어적 리터럴을 사용하십시오). –

2

문제는 아마도 int로 직접 변환됩니다. cmd.ExecuteScalar()이 null을 반환하면 예외가 throw됩니다. 이 경우 무엇을 반환할지 결정해야합니다. 이 예를 들어 내가 0 cmd.ExecuteScalar() 경우 반환 여담으로

using (cn = new SqlConnection(ConnectionString())) 
{ 
    cn.Open(); 
    using (cmd = new SqlCommand(sql, cn)) 
    { 
     cmd.CommandType = CommandType.Text; 
     object result = cmd.ExecuteScalar(); 
     numApprovals = result == null ? 0 : (int)result; 
    } 
} 

return numApprovals; 
+0

HAVING 절로 인해 행이 돌아 오지 않기 때문에. 그러나 귀하의 생각은 정확하지만 여전히 WHERE 절을 실패하고 어쨌든 행을 반환하지 않을 수 있습니다. – gbn

1

를 null로 반환하고, 그것으로 여러 줄의 문자열을 포맷 명확/훨씬 쉽게 :에

string sql = 
@"SELECT COUNT(Type) AS OpenforApproval 
FROM dbo.LeaveRequest 
WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) 
GROUP BY MgtApproval 
HAVING MgtApproval IS NULL"; 
관련 문제