如何在ADO.NET SQL命令中插入当前时间?遇日期类型转换报错
解决SQL datetime插入时的类型转换错误 & 正确插入当前时间的方法
错误原因分析
你遇到的「varchar数据类型转换为datetime数据类型导致值超出范围」错误,核心问题有两个:
- 日期格式不匹配:你直接把
DateTime.Now拼接成字符串插入SQL,生成的日期格式是dd/MM/yyyy HH:mm:ss(比如22/01/2018 16:18:28),但SQL Server默认的日期解析格式可能是MM/dd/yyyy(月/日/年),这时候22作为月份就超出了1-12的范围,直接触发错误。 - 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}"); } } }
回答你的两个初始问题
如何在SQL命令中插入当前日期时间?
直接在SQL语句中使用GETDATE()或SYSDATETIME()函数,让数据库服务器生成当前时间,这是最可靠的方式。如何在ADO.NET SQL命令中插入当前时间?
- 要么用上面的SQL内置函数;
- 要么在程序中获取
DateTime.Now/DateTime.UtcNow,然后通过参数化查询传递给SQL命令,绝对不要直接拼接字符串。
内容的提问来源于stack exchange,提问作者dotnetcoder
相关产品推荐
相关产品推荐

