代码之家  ›  专栏  ›  技术社区  ›  user2181948

将mysqldetime值从c插入到mysql数据库

  •  0
  • user2181948  · 技术社区  · 7 年前

    我有一个C应用程序需要将当前日期时间插入到 datetime mysql数据库中的字段。我怎样才能做到这一点?

    我使用的是mysql connector/net 6.9.9。下面是我迄今为止所做的尝试。 data.currentDateTime 属于类型 MySqlDateTime .

    数据库中的预期结果是正确的日期时间,但是实际值是 0000-00-00 00:00:00 .

        // Set up data object and add datetime
    
        MyData data = new MyData();
        data.currentDateTime = new MySqlDateTime(DateTime.Now);
    
        // Insert into database
        try
        {
            MySqlConnection conn = getMySqlConnection();
            conn.Open();
    
            MySqlCommand cmd = new MySqlCommand(@"
                INSERT INTO my_data (`current_datetime`)
                VALUES (@currentDateTime)
            ", conn);
    
            log.Debug(data.currentDateTime); // correct timestamp
    
            cmd.Parameters.AddWithValue("currentDateTime", data.currentDateTime);
            cmd.ExecuteNonQuery();
    
           // Value in the database is 0000-00-00 00:00:00
    
        } catch (Exception e) {
            // Hnadle exception
        }
    

    mydata类:

        public class MyData
        {
            public int id { get; set; }
            public MySqlDateTime currentDateTime { get; set; }
            // Other fields
    
            public MyData()
            {
                // Empty constructor
            }
        }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Bradley Grainger    7 年前

    你遇到的是 MySQL bug 91199 .

    默认 SQL mode ,mysql服务器将拒绝不正确的 MySqlDateTime 通过连接器/NET序列化的 Incorrect datetime value 错误。

    但是,如果您的MySQL服务器没有 NO_ZERO_DATE strict mode 已启用,然后尝试插入 mysqldetime(mysqldetime) 将成功,但插入的值将为 0000-00-00 00:00:00 .

    自从 bug 91119 已错误地作为副本关闭,这可能不会很快修复。作为解决方法,您可以考虑切换到 MySqlConnector 是一个OSS替代连接器/NET的解决方案(以及许多其他错误)。

    要使用mysql.data解决此问题,请添加底层 DateTime 作为参数值,而不是 mysqldetime(mysqldetime) 对象:

    cmd.Parameters.AddWithValue("currentDateTime", data.currentDateTime.GetDateTime());
    

    请注意,这将引发 MySqlConversionException 如果 mysqldetime(mysqldetime) 无法转换为 日期时间 ;如果在代码中可能发生这种情况,则需要测试 data.currentDateTime.IsValidDateTime 如果是的话做点别的 false .