Datetime对象的值为null,但值仍为null

时间:2018-11-20 14:37:07

标签: c#

我有一些代码检查一个称为上载跟踪器的表,我遇到的问题是,如果存储在数据库中的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异常

2 个答案:

答案 0 :(得分:1)

鉴于显示的代码,最可能的情况是uploadTracekerDate为非空,并且是一个实例,其中LastImportedDate为空(空)Nullable<DateTime>({{1 }}。

这意味着引发该异常的是DateTime?,因此您需要考虑在.ValueLastImportedDate的情况下您实际想要做的事情,并实施该实现-可能需要在访问null之前检查if (uploadTracekerDate.LastImportedDate.HasValue)

但是!这一点很重要:请不要使用将字符串与值连接起来以创建SQL的方法-出于多种原因,这是一个糟糕的想法;在这种情况下,最有可能的问题将是区域设置问题,但是相同的方法也可能导致严重的SQL注入问题。只要有可能(几乎总是这样):首选SQL参数。

答案 1 :(得分:0)

首先,您的代码似乎是错误的。

string lastUpLoadedDateConvetedTOSage =Convert.ToDateTime(uploadTracekerDate.LastImportedDate.Value.ToString("yyyy-MM-dd");

...缺少右括号。

第二,当使用SQL数据库中的值时,尝试与 DBNull.Value 进行比较。