C# 如何安全地查询SQLite中可能不存在的值?

C# 如何安全地查询SQLite中可能不存在的值?,c#,sqlite,nullreferenceexception,string,executescalar,C#,Sqlite,Nullreferenceexception,String,Executescalar,我有一个代码,只要数据库中有匹配的值,它就可以工作: public String GetDeptNameForDeptId(int deptId) { String deptName; const string qry = "SELECT Name FROM Department WHERE Id = @deptID"; try { using (SQLiteConnection con = new SQLiteConnection(HHSUti

我有一个代码,只要数据库中有匹配的值,它就可以工作:

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

但是,如果没有匹配项,则表中不存在作为deptId传入的Id val,则会发生NRE。除了ExecuteScalar之外,还有其他方法可以优雅地失败吗?例如,只需返回一个空字符串?

您只需检查结果:

var result = cmd.ExecuteScalar();
deptName = result == null ? "" : result.ToString();
不要调用ToString,而是使用如下方法:

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

如果返回null或DBNull.Value,则返回空字符串

这个问题对一个和你名声相当的人来说似乎有点容易-检查ExecuteScalar的结果是否为null有什么问题?这可能是一个骗局,就像哈克·芬恩可能是唐吉诃德的骗局一样。瞧,是的,但是…@Grantwiney:当然,这就是我为什么要强调罐头的原因。问题是,如果OP知道ExecuteScalar可以生成空结果,为什么要立即对结果使用ToString,而不是先将其存储在局部变量中?对我来说,这样问很奇怪,我知道这会导致NullReferenceException,但我不会阅读API或使用诸如检查null之类的简单方法来解决它,请给我一些简单的方法,尤其是在答案如此简单的情况下。@Patrick:你似乎认为我知道Convert.ToString与.ToString有很大的不同;我以为它们是六合一,六合一,六合一的其他类型的东西,两种剥猫皮的方法是同义词。所以我估计每个使用ToString的地方,Convert.ToString更安全?