我正在使用 MySQL 4.1.14NT。
我正在使用 ADO.NET 和 MySQL 连接器来查询具有日期时间字段的表
当我运行查询时,我收到错误“无法将 MySQL 日期/时间值转换为 System.DateTime”
我发现的唯一解决方法是将“允许零日期时间=真”添加到数据库的连接字符串中。
这停止了错误,但现在在数据集中,某些日期字段返回日期为 01/01/0001 00:00:00,但是当我在查询浏览器中运行查询时,它们具有正常的日期值。
我能做些什么?
编辑:
CREATE TABLE `notam_status` (
`DEMAND_ID` decimal(6,0) NOT NULL default '0',
`NOTAM_KEY` varchar(25) NOT NULL default '',
`AIRPORT` varchar(5) default NULL,
`ARR_DEP` char(1) default NULL,
`DEP_DATETIME` datetime default NULL,
`ARR_DATETIME` datetime default NULL,
`NOTAM_TEXT` text,
`LAST_MOD_DATETIME` datetime default NULL,
`STATUS` char(1) default NULL,
`STATUS_BY` varchar(15) default NULL,
`STATUS_DATETIME` datetime default NULL,
`SOURCE_ID` char(1) default NULL,
`ACCOUNT_ID` varchar(10) default NULL,
`NOTAM_ID` varchar(9) default NULL,
`NOTAM_PART` decimal(3,0) default NULL,
`CNS_LOCATION_ID` varchar(10) default NULL,
`REMARKS` text,
`TRIPNUMBER` decimal(6,0) default NULL,
PRIMARY KEY (`DEMAND_ID`,`NOTAM_KEY`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 11264 kB; InnoDB free: 7168 kB';
这是我正在使用的代码:
private List<Notam> GetNotamsFor(string airport)
{
List<Notam> result = new List<Notam>();
string sql =
@"SELECT a.source_id, a.account_id, a.notam_id, a.notam_part, a.cns_location_id, cast(a.last_mod_datetime as datetime), a.notam_report, a.q_code, a.effective_datetime, a.expire_datetime
FROM notams a
WHERE (a.cns_location_id = ?airport
OR a.cns_location_id = ?kairport)
AND a.source_id != 'F'
AND (a.cancel_datetime IS NULL OR a.cancel_datetime > UTC_Timestamp())
AND (a.delete_datetime IS NULL OR a.delete_datetime > UTC_Timestamp())
";
MySqlParameter[] parameters = new MySqlParameter[]
{
new MySqlParameter
{
ParameterName="airport",
MySqlDbType=MySqlDbType.String,
Value=airport
},
new MySqlParameter
{
ParameterName="kairport",
MySqlDbType=MySqlDbType.String,
Value="k"+airport
}
};
DataSet ds = RunMySqlQuery(sql, "weather", parameters);
// If I look at the dataset, the field "last_mod_datetime'
// has the value 01/01/0001 00:00:00
if (ds.Tables.Count > 0)
foreach (DataRow r in ds.Tables[0].Rows)
{
result.Add(NotamFiller.FillFrom(r));
}
return result;
}
private DataSet RunMySqlQuery(string sql, string database, MySqlParameter[] parameters)
{
DataSet ds = new DataSet();
try
{
MySqlCommand mc = new MySqlCommand(sql, _MySqlConnection);
if (parameters != null)
mc.Parameters.AddRange(parameters);
var adapter = new MySqlDataAdapter(mc);
adapter.Fill(ds);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return ds;
}