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

如何在ADO.NET SQL命令中插入当前时间?遇日期类型转换报错

解决SQL datetime插入时的类型转换错误 & 正确插入当前时间的方法

错误原因分析

你遇到的「varchar数据类型转换为datetime数据类型导致值超出范围」错误,核心问题有两个:

  1. 日期格式不匹配:你直接把DateTime.Now拼接成字符串插入SQL,生成的日期格式是dd/MM/yyyy HH:mm:ss(比如22/01/2018 16:18:28),但SQL Server默认的日期解析格式可能是MM/dd/yyyy(月/日/年),这时候22作为月份就超出了1-12的范围,直接触发错误。
  2. SQL注入风险:直接拼接字符串生成SQL是非常不安全的做法,很容易被恶意注入攻击,同时也会带来类型转换的各种问题。

正确的解决方案(两种方式)

方式1:让SQL Server直接生成当前时间(推荐)

不需要在程序里传递时间,直接用SQL Server内置的函数获取数据库服务器的当前时间,既避免格式问题,又能保证时间的一致性:

string usecase = "manhole";
// 用using语句自动管理连接和命令的资源,避免泄漏
using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString))
{
    con.Open();
    using(SqlCommand cmdInsert = new SqlCommand(
        "INSERT INTO sms (usecase, sms, updtd_date) VALUES (@usecase, @smsbody, GETDATE())", 
        con))
    {
        // 使用参数化查询,避免字符串拼接
        cmdInsert.Parameters.AddWithValue("@usecase", usecase);
        cmdInsert.Parameters.AddWithValue("@smsbody", smsbody);
        
        try 
        {
            cmdInsert.ExecuteNonQuery();
        }
        catch(Exception ex)
        {
            // 这里可以添加异常处理逻辑,比如记录日志
            Console.WriteLine($"插入失败:{ex.Message}");
        }
    }
}
  • SQL Server中可用的时间函数:
    • GETDATE():返回当前系统的datetime类型时间
    • SYSDATETIME():返回精度更高的datetime2类型(SQL Server 2008及以上版本支持)

方式2:通过程序传递当前时间(参数化查询)

如果必须使用程序端的时间,一定要用参数化查询,ADO.NET会自动处理类型转换,完全避免格式问题:

DateTime nowTime = DateTime.Now; // 推荐用DateTime.UtcNow避免时区问题
string usecase = "manhole";

using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString))
{
    con.Open();
    using(SqlCommand cmdInsert = new SqlCommand(
        "INSERT INTO sms (usecase, sms, updtd_date) VALUES (@usecase, @smsbody, @nowTime)", 
        con))
    {
        cmdInsert.Parameters.AddWithValue("@usecase", usecase);
        cmdInsert.Parameters.AddWithValue("@smsbody", smsbody);
        // 可以明确指定参数类型,更严谨
        cmdInsert.Parameters.Add("@nowTime", SqlDbType.DateTime).Value = nowTime;
        
        try 
        {
            cmdInsert.ExecuteNonQuery();
        }
        catch(Exception ex)
        {
            Console.WriteLine($"插入失败:{ex.Message}");
        }
    }
}

回答你的两个初始问题

  1. 如何在SQL命令中插入当前日期时间?
    直接在SQL语句中使用GETDATE()或SYSDATETIME()函数,让数据库服务器生成当前时间,这是最可靠的方式。

  2. 如何在ADO.NET SQL命令中插入当前时间?

    • 要么用上面的SQL内置函数;
    • 要么在程序中获取DateTime.Now/DateTime.UtcNow,然后通过参数化查询传递给SQL命令,绝对不要直接拼接字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:59:27