0

我正在使用 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;
        }
4

2 回答 2

0

结果发现填充表格的代码中存在问题。MySQLParameter 类的 MySqlDBType 设置为 String 而不是 Timestamp

于 2013-02-06T19:24:47.987 回答
0

事实证明,在更新日期字段时,填充表的其他代码使用 MySqlParameter 和 MySqlDBType.String 而不是 MySqlDBType.Timestamp,并且它最终将 01-01-0001 00:00 存储在日期字段中。

于 2013-02-07T14:53:56.683 回答