我有一些代码检查一个称为上载跟踪器的表,我遇到的问题是,如果存储在数据库中的datetime的值为null,则会导致此部分代码崩溃。
using (var db = new SOMEntities1())
{
var uploadTracekerDate = db.UploadTrackers.Where(w => w.TableName == "Stock").FirstOrDefault();
if (uploadTracekerDate != null)
{
string lastUpLoadedDateConvetedTOSage =Convert.ToDateTime(uploadTracekerDate.LastImportedDate.Value.ToString("yyyy-MM-dd");
var stockwhereClause = string.Format(" and STOCK.RECORD_CREATE_DATE >= '{0}'", lastUpLoadedDateConvetedTOSage);
stockwhereClause = stockwhereClause + string.Format(" and STOCK.RECORD_MODIFY_DATE >= '{0}'",
lastUpLoadedDateConvetedTOSage);
sql += stockwhereClause;
}
}
处理此错误的最佳方法是什么,因为无论我用来捕获对象为null的值,该值似乎都会触发null异常
答案 0 :(得分:1)
鉴于显示的代码,最可能的情况是uploadTracekerDate
为非空,并且是一个实例,其中LastImportedDate
为空(空)Nullable<DateTime>
({{1 }}。
这意味着引发该异常的是DateTime?
,因此您需要考虑在.Value
为LastImportedDate
的情况下您实际想要做的事情,并实施该实现-可能需要在访问null
之前检查if (uploadTracekerDate.LastImportedDate.HasValue)
。
但是!这一点很重要:请不要使用将字符串与值连接起来以创建SQL的方法-出于多种原因,这是一个糟糕的想法;在这种情况下,最有可能的问题将是区域设置问题,但是相同的方法也可能导致严重的SQL注入问题。只要有可能(几乎总是这样):首选SQL参数。
答案 1 :(得分:0)
首先,您的代码似乎是错误的。
string lastUpLoadedDateConvetedTOSage =Convert.ToDateTime(uploadTracekerDate.LastImportedDate.Value.ToString("yyyy-MM-dd");
...缺少右括号。
第二,当使用SQL数据库中的值时,尝试与 DBNull.Value 进行比较。