Как безопасно запросить потенциально несуществующее значение в SQLite?

У меня есть этот код, который работает, пока есть соответствующее значение в базе данных:

public String GetDeptNameForDeptId(int deptId)
{
    String deptName;
    const string qry = "SELECT Name FROM Department WHERE Id = @deptID";

    try
    {
        using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection()))
        {
            con.Open();
            SQLiteCommand cmd = new SQLiteCommand(qry, con);
            cmd.Parameters.Add(new SQLiteParameter("deptID", deptId));
            deptName = cmd.ExecuteScalar().ToString();
        }
    }
    catch (Exception ex)
    {
        String msgInnerExAndStackTrace = String.Format(
            "{0}; Inner Ex: {1}; Stack Trace: {2}", ex.Message, ex.InnerException, ex.StackTrace);
        ExceptionLoggingService.Instance.WriteLog(String.Format("From Platypus.GetDeptNameForDeptId: {0}", msgInnerExAndStackTrace));
        return "No matching value found"; //String.Empty;
    }
    return deptName;
}

Однако, если нет совпадения (значение Id, переданное как deptId, не существует в таблице), возникает NRE. Есть ли альтернатива ExecuteScalar(), которая изящно провалится? Например, просто вернуть пустую строку?

2 ответа

Решение

Вместо звонка ToString использование Convert.ToString метод как:

 deptName = Convert.ToString(cmd.ExecuteScalar());

это вернет пустую строку в случае null или же DBNull.Value возвращается

Вы можете просто проверить результат:

var result = cmd.ExecuteScalar();
deptName = result == null ? "" : result.ToString();
Другие вопросы по тегам