如何使用MySQL Reader处理null Datetime

时间:2013-12-05 16:17:26

标签: c# mysql .net

我正在尝试使用C#.Net中的MySqlDataReader迭代我的MySQL数据库,但是我无法检查任何DateTime列是否为空或先为空。我已经创建了一个动态列表(“MyList”)并计划迭代数据库并添加自定义字段的每个项目,其中一些是DateTimes,但在此过程中我收到错误“此方法或属性无法调用关于空值。“

对于字符串值,我通常使用此内联语法来检查列是否为空:

Value = reader["Name"] != null ? reader["Name"].ToString() : ""

但似乎有一个不同的DateTime列进程,我无法弄清楚,这是我的代码片段:

using MySql.Data.MySqlClient;

List<dynamic> MyList = new List<dynamic>();

using(MySqlConnection con = new MySqlConnection("server=localhost;database=database;user  id=user;password=password")){
    con.Open(); 

    string sql = "SELECT * FROM Items";
    DateTime defaultDate = DateTime.Now;

    MySqlCommand cmd = new MySqlCommand(sql,con);

    using(MySqlDataReader reader = cmd.ExecuteReader()){
        while(reader.Read()){ 
            MyList.Add(new {
                Value = reader["Name"] != null ? reader["Name"].ToString() : "",
                Date = reader.GetDateTime(reader.GetOrdinal("Date")) != null ? reader.GetDateTime(reader.GetOrdinal("Date")) : defaultDate
            });
        }   
    }   

    con.Close();
}

4 个答案:

答案 0 :(得分:3)

您可以使用以下帮助功能(SO用户Rein已在相关问题here中写入),该功能将为您处理任何问题数据库类型,可以是Null。

Date = ConvertFromDBVal<DateTime>(reader.GetOrdinal("Date"));

使用通用功能:

public static T ConvertFromDBVal<T>(object obj)
{
    if (obj == null || obj == DBNull.Value) {
        return default(T); // returns the default value for the type
    }
    else
    {
        return (T)obj;
    }
}

答案 1 :(得分:2)

使用DateTime.TryParse检测值是否为有效的DateTime,如下所示:

while(reader.Read()){
        if(reader["Date"] != DBNull.Value)
                DateTime.TryParse(reader["Date"].ToString(), out defaultDate);
        MyList.Add(new {
            Value = reader["Name"] != null ? reader["Name"].ToString() : "",
            Date = defaultDate
        });
}

答案 2 :(得分:0)

我最终将日期转换为Sql Query中的字符串以自行解析(参见convert timestamp to date)。

然后sql查询看起来像:

 select DATE_FORMAT(dateColumn, '%d/%m/%Y %h:%i:%s') as dateColumn from ...

答案 3 :(得分:0)

如果你和我一样使用 MySqlReader,你可以使用这个代码:

int datahoralocalOrdinal;
if ((datahoralocalOrdinal = objReader.GetOrdinal("DATAHORALOCAL")) > 0 && !objReader.IsDBNull(datahoralocalOrdinal)) {
    object datahoralocal = objReader.GetValue(datahoralocalOrdinal);
        if (datahoralocal is MySqlDateTime msdt && msdt.IsValidDateTime) {
            DateTime.TryParse($"{msdt}", out DateTime dt);
            if (dt != null) {
                    view.date = new DateTimeOffset(dt).ToUnixTimeMilliseconds();
            }
        }
}