После ExecuteScalar: ссылка на объект не установлена ​​и т. Д. - PullRequest
5 голосов
/ 10 июля 2009

Какой код я должен добавить, чтобы принимать ноль из оператора 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 ]

12 голосов
/ 10 июля 2009

Просто:

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();
    }
}    

Если проблема, как говорит Джейми, в том, что ExecuteScalar возвращает ноль, самый простой способ обойти это привести его к обнуляемому целому числу и использовать оператор объединения нулей:

return (int?) cmd.ExecuteScalar() ?? 0;
2 голосов
/ 10 июля 2009

Проблема, вероятно, заключается в прямом приведении к int. Это вызывает исключение, если cmd.ExecuteScalar() возвращает ноль. Вам нужно решить, что вернуть в таком случае. Для этого примера я возвращаю 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;
1 голос
/ 10 июля 2009

Кроме того, намного проще / понятнее форматировать многострочные строки как:

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...