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

How to Safely Query for a Potentially Nonexistent Value in 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;
}

但是如果不匹配(作为deptId传入的Id val在table中不存在),就会出现NRE。是否有 ExecuteScalar() 的替代方案可以优雅地失败?例如,只是 return 一个空字符串?

您可以直接查看结果:

var result = cmd.ExecuteScalar();
deptName = result == null ? "" : result.ToString();

而不是调用 ToString 使用 Convert.ToString 方法,例如:

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

如果 nullDBNull.Value 被 returned,这将 return 空字符串。