将 char 数据类型转换为 datetime 数据类型会导致 datetime 值超出范围。异常
Posted
技术标签:
【中文标题】将 char 数据类型转换为 datetime 数据类型会导致 datetime 值超出范围。异常【英文标题】:The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. SqlException 【发布时间】:2014-06-04 06:53:37 【问题描述】:我是 asp.net 的初学者。我正在使用查询:
string num = ("SELECT count(*) from booking WHERE date='" + dt + "' AND start_time='" + stime + "' AND end_time='" + etime + "' AND lid='" + hostloc + "'");
SqlCommand cmd = new SqlCommand(num, con);
con.Open();
int count = (int)cmd.ExecuteScalar();
con.Close();
有时当我提交我的 web 表单时,它会给我一个 SqlException:
"导致将 char 数据类型转换为 datetime 数据类型 在超出范围的日期时间值中。”
这并不总是发生! 请,任何帮助表示赞赏.. 提前谢谢你
【问题讨论】:
它发生的日期是什么时候? 关键技巧:不要将值连接到命令文本中。参数是强类型的:它们不会被误解 这是一个用于预订的网络表单。它的值由用户使用 ajaxcalenderxtender 选择 当错误发生时可能是那些日期值之一为空? 【参考方案1】:string num = "SELECT count(*) from booking WHERE date=@dt AND start_time=@stime AND end_time=@etime AND lid=@hostloc";
using(SqlCommand cmd = new SqlCommand(num, con))
cmd.Parameters.AddWithValue("dt", dt);
// etc for all params
con.Open();
int count = (int)cmd.ExecuteScalar();
请注意,这假设 dt
是 DateTime
等。
这解决了多个问题,包括格式化、本地化和 SQL 注入。
【讨论】:
字符串 hostloc =DropDownList1.SelectedValue.ToString();字符串 dt = TextBox1.Text;转换.ToDateTime(dt);字符串时间 = TextBox2.Text;字符串 etime = TextBox3.Text;字符串主题 = TextBox4.Text; string num = ("SELECT count(*) from booking WHERE date='" + dt + "' AND start_time='" + stime + "' AND end_time='" + etime + "' AND lid='" + hostloc + "'"); SqlCommand cmd = new SqlCommand(num, con); con.Open(); int count = (int)cmd.ExecuteScalar(); con.Close(); @user 哇,sql 注入天堂。如果您经常编写这样的数据访问代码:立即停止。你需要参数化。真的。【参考方案2】:首先对您的 SQL 调用使用参数化查询,否则您可能很快就会被注入 SQL。
您还需要在将变量发送到 SQL Server 之前将 dt 转换为 datetime 以避免此类错误,例如 Convert.ToDatetime(dt)
。
【讨论】:
@user2311 然后接受我的回答 :)以上是关于将 char 数据类型转换为 datetime 数据类型会导致 datetime 值超出范围。异常的主要内容,如果未能解决你的问题,请参考以下文章
如何将 varchar 日期转换为 datetime2 日期