代码之家  ›  专栏  ›  技术社区  ›  Xach

ExecuteEscalar之后:未设置对象引用等

  •  5
  • Xach  · 技术社区  · 6 年前

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

    {
        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;
    }
    
    3 回复  |  直到 16 年前
        1
  •  12
  •   Jon Skeet    16 年前

    公正:

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

    但我一点也不相信这就是你真正想要的,或者问题的根源。

    如果您在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将返回空值,这是将其强制转换为可为空的int并使用空合并运算符的最简单方法:

    return (int?) cmd.ExecuteScalar() ?? 0;
    
        2
  •  2
  •   Jamie Ide    16 年前

    问题可能是直接强制转换为int。如果 cmd.ExecuteScalar() 返回NULL。在这种情况下,你需要决定归还什么。对于此示例,如果 命令.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;
    
        3
  •  1
  •   mancaus    16 年前

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

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