【问题标题】:ADO.NET accessing MySql - Unable to convert MySQL date/time value to System.DateTimeADO.NET 访问 MySql - 无法将 MySQL 日期/时间值转换为 System.DateTime
【发布时间】:2013-01-21 19:42:12
【问题描述】:

我正在使用 MySQL 4.1.14NT。

我正在使用 ADO.NET 和 MySQL 连接器来查询具有日期时间字段的表

当我运行查询时,我收到错误“无法将 MySQL 日期/时间值转换为 System.DateTime”

我发现的唯一解决方法是将“允许零日期时间=true”添加到数据库的连接字符串中。

这停止了错误,但现在在数据集中,某些日期字段返回日期为 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;
        }

【问题讨论】:

  • 您能否指出是哪些值导致了您的问题?
  • 您的架构是什么样的,您的代码是什么样的?你确定你要的是 填写的数据,而不是 null 吗? (一个简短但完整的程序 + 架构 + 证明问题的数据将使诊断更容易。)
  • 你必须使用 7 年以上的 MySQL 版本吗?您是否在更新的版本中尝试过相同的代码?
  • JS - 我要的是填写好的数据
  • 发现问题:在填充表的代码中,我将 MySqlDBType 设置为字符串而不是时间戳。

标签: .net mysql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2011-06-05
      • 2013-06-04
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多