Visual Studio中VB.NET用DateTimePicker插入MySQL报日期错误是什么原因
错误原因
- 核心问题是MySQL日期格式不匹配:MySQL的
DATE/DATETIME类型要求标准日期格式为YYYY-MM-DD,你代码中直接拼接DateTimePicker1.Value.Date时,会自动调用系统默认的区域格式转换为字符串,你当前系统输出的是MM/DD/YYYY格式,不符合MySQL字段的格式校验规则,因此抛出报错。 - 额外隐患:你当前直接拼接用户输入生成SQL语句的写法存在严重SQL注入风险,恶意用户可通过输入特殊字符篡改SQL逻辑,甚至造成数据泄露、数据丢失等问题。
- 操作方法错误:插入属于写操作,不应该调用
ExecuteReader(该方法用于查询场景返回结果集),应该调用ExecuteNonQuery执行写操作。
修复方案
推荐直接使用MySQL参数化查询,无需手动处理日期格式,同时天然规避SQL注入风险,参考代码如下:
Dim query As String conn.Open() ' 编写带占位符的SQL语句,不要直接拼接变量 query = "INSERT INTO `librarydb`.`tblmember` (`Name`, `NIC`, `Gender`,`Contact`,`Email`,`Date_Joined`) VALUES (@Name, @NIC, @Gender, @Contact, @Email, @DateJoined);" COMMAND = New MySqlCommand(query, conn) ' 逐个绑定参数,驱动会自动适配数据类型和格式 COMMAND.Parameters.AddWithValue("@Name", txtname.Text) COMMAND.Parameters.AddWithValue("@NIC", txtNIC.Text) COMMAND.Parameters.AddWithValue("@Gender", txtgender.Text) COMMAND.Parameters.AddWithValue("@Contact", txtcontact.Text) COMMAND.Parameters.AddWithValue("@Email", txtemail.Text) ' 直接传入DateTime类型值即可,无需手动转字符串 COMMAND.Parameters.AddWithValue("@DateJoined", DateTimePicker1.Value.Date) ' 执行插入操作调用ExecuteNonQuery COMMAND.ExecuteNonQuery() conn.Close()
临时验证提示:如果仅做临时调试不想改参数化写法,可手动格式化日期为MySQL支持的格式:
DateTimePicker1.Value.ToString("yyyy-MM-dd"),但该方式依然存在SQL注入风险,禁止在生产环境使用。
内容的提问来源于stack exchange,提问作者Mohamed Sharaf
相关产品推荐
相关产品推荐

