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

Yve*_*ves 5 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 " +
       "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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

只是:

WHERE Type IN (2, 3, 4, 5, 6, 8, 13, 14, 16, 22) OR Type IS NULL
Run Code Online (Sandbox Code Playgroud)

但我完全不相信你真正想要的东西,或问题的原因.

如果您在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();
    }
}    
Run Code Online (Sandbox Code Playgroud)

如果问题与Jamie说的那样,那就是ExecuteScalar返回null,最简单的方法就是将它转换为可以为空的int并使用null合并运算符:

return (int?) cmd.ExecuteScalar() ?? 0;
Run Code Online (Sandbox Code Playgroud)