将 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();

请注意,这假设 dtDateTime 等。

这解决了多个问题,包括格式化、本地化和 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 值超出范围。异常的主要内容,如果未能解决你的问题,请参考以下文章

将COleDateTime类型数据转换成char *数据

如何将 varchar 日期转换为 datetime2 日期

如何将DateTime类型转换成String类型

在net中怎么把datetime类型转换成毫秒数

将 datetime2 数据类型转换为 datetime 数据错误

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围 - 未使用 DateTime2