我正在尝试使用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();
}
答案 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();
}
}
}