如何为DateTimePicker自动添加编辑日期并解决MySQL日期转换报错
问题根因分析
- 插入日期的格式不符合MySQL规范:MySQL默认识别的日期格式为
yyyy-MM-dd,你代码中使用dd/mm/yyyy格式拼接SQL,插入后日期字段会变成非法值0000-00-00,查询时MySQL数据适配器无法将该非法值转换为.NET的日期类型,就会抛出转换错误。 - 直接拼接SQL的写法本身存在兼容性问题:不同地区、不同系统的日期字符串格式可能存在差异,手动转字符串拼接很容易出现格式不匹配的问题,同时还存在SQL注入风险。
- 如果要使用
ON UPDATE CURRENT_TIMESTAMP属性,对应的字段需要设置为TIMESTAMP/DATETIME类型,手动传值反而可能干扰数据库自动填充的逻辑。
可行解决方案
方案1:改用参数化查询(最推荐)
修改后的新增按钮代码:
Private Sub tambah_btn_Click(sender As Object, e As EventArgs) Handles tambah_btn.Click cmd = conn.CreateCommand() cmd.CommandType = CommandType.Text ' 用参数占位,不需要手动拼接字符串 cmd.CommandText = "insert into produk values(@kode, @nama, @harga, @tgl_beli)" ' 直接传递DateTime类型,不需要手动转字符串 cmd.Parameters.AddWithValue("@kode", kode.Text) cmd.Parameters.AddWithValue("@nama", nama.Text) cmd.Parameters.AddWithValue("@harga", harga.Text) cmd.Parameters.AddWithValue("@tgl_beli", DateTimePicker1.Value.Date) cmd.ExecuteNonQuery() kode.Text = "" nama.Text = "" harga.Text = "" disp_data() MessageBox.Show("Data berhasil ditambahkan") End Sub
兼容历史非法日期配置
如果数据库里已经存在0000-00-00格式的非法日期,需要在MySQL连接字符串中添加Convert Zero Datetime=True参数,示例:server=127.0.0.1;user=root;database=你的库名;password=你的密码;Convert Zero Datetime=True
方案2:搭配ON UPDATE CURRENT_TIMESTAMP实现自动填充
首先修改表结构,新增自动更新的时间字段:
ALTER TABLE produk ADD COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
后续插入、修改数据时都不需要给update_time字段传值,MySQL会自动在数据新增、更新时把该字段设置为当前时间,不需要业务代码额外处理。
实现原理
- 参数化查询传递.NET原生DateTime类型时,MySQL驱动会自动将其转换为MySQL兼容的日期格式,完全避免手动处理字符串格式的出错风险,同时还能防范SQL注入。
- 连接字符串添加
Convert Zero Datetime=True后,驱动会自动把数据库中的0000-00-00非法值转换为.NET中的DateTime.MinValue,不会抛出转换异常。 ON UPDATE CURRENT_TIMESTAMP是MySQL原生的字段属性,只要该行数据的任意字段发生变更,MySQL会自动将该字段更新为当前时间,不需要业务代码参与处理。
内容的提问来源于stack exchange,提问作者Gmail Gmqil
相关产品推荐
相关产品推荐

