C# ExecuteScalar之后:未设置对象引用等

C# ExecuteScalar之后:未设置对象引用等,c#,sql,C#,Sql,我应该添加什么代码来接受WHERE语句中的null { 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 " + "

我应该添加什么代码来接受WHERE语句中的null

{
    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;
}
只是:

但我一点也不相信这是你真正想要的,或者是问题的原因

如果你在C#代码中得到一个异常,它不会来自where子句

顺便说一句,我担心的是,您的连接似乎在重用现有变量。坏主意。它几乎肯定是一个局部变量。您还可以通过从中间返回来简化代码:

string sql = ...;

using (var cn = new SqlConnection(ConnectionString()))
{
    cn.Open();
    using (cmd = new SqlCommand(sql, cn))
    {
        cmd.CommandType = CommandType.Text;
        return (int) cmd.ExecuteScalar();
    }
}    
如果问题如Jamie所说,ExecuteScalar返回null,最简单的解决方法是将其转换为可为null的int并使用null合并运算符:

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

问题可能是直接转换为int。如果
cmd.ExecuteScalar()
返回null,则会引发异常。在这种情况下,你需要决定归还什么。对于本例,如果
cmd.ExecuteScalar()
返回null,则返回0

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;

另外,将多行字符串的格式设置为:

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";

sqlexception:在“nullgroup”附近不正确语法。“如果键入(2、3、4、5、6、8、13、14、16、22)或类型为NULL”+“GROUP BY MgtApproval”+您没有在“NULL”后面加空格。你们应该有“…是空的”+“分组依据…”(或者使用逐字字符串文字来简化这个过程)乔恩:很抱歉不同意上帝的说法,但为什么这会解决它呢?HAVING子句删除了零计数,因为它是一个后聚合过滤器,不是吗?@Jamie:的确,这就是为什么我的代码返回int,如果结果为null,则返回0。这就是null合并运算符的优点。这只是因为HAVING子句不会返回任何行。然而,你的想法是正确的,但是它仍然可能不符合WHERE子句,并且不会返回任何行。你能为你的问题提供一个更好的标题吗?这是非常普通的。对不起,亚历克斯,我下次会做得更好。
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";