You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DateTimePicker数据存入数据库?附报错代码求助

解决DateTimePicker日期存入SQL Server date字段的转换错误问题

嘿,我一眼就看出问题所在了——你现在用字符串拼接SQL的方式传递日期值,不仅容易触发日期格式不匹配的转换错误,还存在严重的SQL注入风险!咱们一步步来修正:

错误原因分析

你代码里把dtp_text直接拼进SQL字符串时,.NET会把DateTime对象默认转成当前系统文化的字符串格式,而SQL Server的date类型对输入格式有严格要求,一旦格式不匹配就会抛出「从字符串转换日期和/或时间时转换失败」的错误。而且这种拼接方式还可能被恶意用户利用注入攻击,绝对要改掉。

正确的解决方案:参数化查询

用参数化查询不仅能完美解决日期格式问题,还能彻底避免SQL注入。另外,DateTimePicker本身就有Value属性(原生DateTime类型),根本不用去转Text属性,这比解析文本可靠多了。

修改后的完整代码如下:

private void btnAdd_Click(object sender, EventArgs e)
{
    // 用using语句自动管理连接,避免忘记关闭或异常时未释放资源
    using (SqlConnection cnn = new SqlConnection("你的数据库连接字符串"))
    {
        cnn.Open();
        // 明确指定表的列名,避免依赖表的默认列顺序(更安全清晰)
        string sql = "INSERT INTO NV (Id, Name, Birthday) VALUES (@Id, @Name, @Birthday)";
        SqlCommand ins = new SqlCommand(sql, cnn);
        
        // 添加参数,指定参数类型和值
        ins.Parameters.Add("@Id", SqlDbType.VarChar).Value = txtId.Text;
        ins.Parameters.Add("@Name", SqlDbType.NVarChar).Value = txtName.Text;
        // 直接用DateTimePicker的Value属性,原生DateTime类型,无需转换
        ins.Parameters.Add("@Birthday", SqlDbType.Date).Value = dtp.Value.Date; // 如果只需要日期部分,加.Date
        
        // 执行插入
        ins.ExecuteNonQuery();
        Load();
    } // using结束后自动关闭连接
}

额外的优化建议

  • 用using管理资源:数据库连接、SqlCommand这些实现了IDisposable的对象,最好用using语句包裹,确保资源自动释放,哪怕发生异常也不会导致连接泄漏。
  • 明确列名:SQL语句里指定要插入的列名,不要像原来那样省略,这样以后表结构调整(比如新增字段)时,你的插入语句不会因为列顺序变化而出错。
  • 性别字段的简化:你原来的性别判断可以简化成int gt = rdoMale.Checked ? 1 : 0;,如果需要插入性别字段,记得也用参数化的方式加进去哦。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:15:15