是否从数据库中转换Null DateTime值?

时间:2019-03-25 13:36:40

标签: c# sql-server datetime casting

我正在执行一个简单的SELECT语句,并试图从SQL Server 2012表的DateTime列返回值。问题是当我返回NULL DateTime值时,我不知道如何使用下面的代码来管理它。

dtTrainingEnd = (DateTime)reader["TrainingEnd"];

我已经搜索了最近几天的答案,却找不到对我有帮助的内容。我发现了类似的帖子,但仍然无法弄清楚它们如何为我提供帮助。您能否解释一下如何检查数据库返回的datetime值是否为NULL?

SqlConnection connRead = new SqlConnection(connReadString);
SqlCommand comm = new SqlCommand();
SqlDataReader reader;
string sql;

DateTime dtTrainingEnd = DateTime.Now;
int iTrainingSwipeID = 123;

sql = "SELECT TrainingEnd FROM TrainingSwipe WHERE TrainingSwipeID = " + iTrainingSwipeID;

comm.CommandText = sql;
comm.CommandType = CommandType.Text;
comm.Connection = connRead;

connRead.Open();
reader = comm.ExecuteReader();

while (reader.Read())
{
    dtTrainingEnd = (DateTime)reader["TrainingEnd"];
}
connRead.Close();

2 个答案:

答案 0 :(得分:3)

如果它可能是null,则可以使用可为空的类型...在这种情况下,可以使用DateTime?类型:

while (reader.Read())
{
    dtTrainingEnd = ((DateTime?)reader["TrainingEnd"]) ?? some_default_date;
}
connRead.Close();

或者如果愿意,可以测试null

while (reader.Read())
{
    var endDate = reader["TrainingEnd"];
    dtTrainingEnd = (endDate == null) ? some_default_date : (DateTime)endDate;
}
connRead.Close();

在上述两种情况下,如果数据库中的日期为NULL,我都假设您希望dtTrainingEnd包含某物,因此some_default_date是一些默认的DateTime。

或者,如果您希望将dtTrainingEnd保留为空,则在这种情况下不要设置它:

while (reader.Read())
{
    if ((reader["TrainingEnd"]) != null)
        dtTrainingEnd = (DateTime)reader["TrainingEnd"];
}
connRead.Close();

***根据连接数据库的方式,您可能必须用 null

替换 DBNull.Value

答案 1 :(得分:1)

使用SQL可以执行SELECT Coalesce(TrainingEnd,0),如果该参数为null,则日期为1900-01-01 ...