2009-07-10 22 views
5

Mã nào tôi nên thêm để chấp nhận null từ câu lệnh WHERE.Sau khi ExecuteScalar: Tham chiếu đối tượng không được đặt vv

{ 
    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

Bạn có thể xin vui lòng cho một tiêu đề tốt hơn để bạn câu hỏi? Điều này rất chung chung. –

+0

Xin lỗi Alex, lần sau tôi sẽ làm tốt hơn. – Yves

Trả lời

12

Chỉ:

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

Nhưng tôi không phải ở tất cả các tin đó là những gì bạn thực sự muốn, hoặc nguyên nhân của vấn đề.

Nếu bạn nhận được ngoại lệ trong mã C#, nó sẽ không nằm trong mệnh đề where.

Tôi lo lắng bởi thực tế là kết nối của bạn dường như đang sử dụng lại biến hiện tại, bằng cách này. Ý tưởng tồi. Nó gần như chắc chắn sẽ là một biến địa phương. Bạn cũng có thể làm cho mã của bạn đơn giản bằng cách quay từ giữa nó:

string sql = ...; 

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

Nếu vấn đề là như Jamie nói, rằng ExecuteScalar đang trở lại null, cách dễ nhất để nhận được vòng đó là bỏ nó vào một nullable int và sử dụng toán tử kết hợp rỗng:

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

sqlexception: cú pháp incoreect gần 'nullgroup'. "WHERE Gõ IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) HOẶC Loại IS NULL" + "GROUP BY MgtApproval" + – Yves

+0

Bạn chưa đặt dấu cách sau "NULL ". –

+0

tức là bạn phải có "... IS NULL" + "GROUP BY ..." (hoặc sử dụng chuỗi chữ đúng nguyên văn để làm điều này dễ dàng hơn) –

2

Vấn đề có thể là trực tiếp truyền tới int. Điều này sẽ ném một ngoại lệ nếu cmd.ExecuteScalar() trả về giá trị rỗng. Bạn cần phải quyết định những gì để trở lại trong trường hợp đó. Ví dụ này tôi trở về 0 nếu cmd.ExecuteScalar() trả về NULL

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

Chỉ vì không có hàng nào quay lại vì mệnh đề HAVING. Tuy nhiên, ý tưởng của bạn là chính xác nhưng nó vẫn có thể thất bại mệnh đề WHERE và không trả lại hàng nào – gbn

1

Là một sang một bên, nó dễ dàng hơn nhiều/rõ ràng hơn để định dạng chuỗi nhiều dòng như:

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"; 
Các vấn đề liên quan