将日历扩展器选择日期格式转换为 DateTime 数据类型导致值超出范围

The conversion of a calender extender selection date format to a DateTime data type resulted in an out-of-range value

我试图通过将日历扩展程序选择输入文本框并从数据库中获取相应的计数来获取特定日期的记录数。 checkdate 列的数据类型是 DateTime。我们试过了:

protected void Page_Load(object sender, EventArgs e) {
  if (!IsPostBack) {
    string result = "select count(*) from <TableName> where Checkdate= GETDATE() and sub_code=@sub_code";
    SqlCommand cmd = new SqlCommand(result, connection);
    connection.Open();
    Label3.Visible = true;
    Label3.Text = cmd.ExecuteScalar().ToString();
    connection.Close();
  }
}

protected void Button1_Click(object sender, EventArgs e) {
  Label5.Visible = true;

  Label3.Visible = true;

  string query = "select count(*) from <TableName> where Checkdate= @checkdate and sub_code=@sub_code";

  SqlCommand cmd = new SqlCommand(query, connection);
  cmd.Parameters.AddWithValue("@checkdate", tbdate.Text);
  connection.Open();

  Label5.Text = cmd.ExecuteScalar().ToString();

  connection.Close();
}

但我收到以下错误: 将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。 说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。

来源错误:

第 125 行:connection.Open(); 第 126 行: 第 127 行:Label5.Text = cmd.ExecuteScalar().ToString(); 第 128 行: 第 129 行:connection.Close();

DB中存储的日期格式为:2018-04-24 12:00:22.803

这里至少有两个问题。

首先,在按钮点击事件中,你有一行

cmd.Parameters.AddWithValue("@checkdate", tbdate.Text);

这是将日期的视觉(文本)表示作为文本字符串放入参数中 - 您需要将日期作为日期,而不是它的文本显示。这就是您收到转换错误的原因。对你的问题的评论讨论了这个问题,所以这个问题可能已经解决了。

其次,在两个 SQL 查询中,您都没有正确检查日期,这就是您得到零计数的原因。在按钮单击查询中,您有 "where Checkdate= @checkdate"。你说 checkdate 是一个日期时间,在例子中时间部分是 12:00 。您来自程序的日期没有时间部分(或者实际上它有 00:00 的时间),因此您不会匹配。您只需要检查检查日期的日期部分,例如 "where CAST(Checkdate as date) = @checkdate".

在页面加载中,你有同样的问题,但双方都有;你有 "where Checkdate= GETDATE()"。 Getdate returns 一次,因此您不会加载任何不是在页面加载的同一毫秒内创建的内容。你需要"where Cast(Checkdate as date) = Cast(GETDATE() as date)"

我设法通过以下方法解决了这个问题,我只是将获取日期的日期部分保存为:checkdate= convert(date, GETDATE()) 然后这样称呼它:

  SqlCommand cmd = new SqlCommand(query, connection); 
  string textboxdate = tbdate.Text;
            DateTime lastdate = DateTime.ParseExact(textboxdate,
                       "dd/MM/yyyy",
                       System.Globalization.CultureInfo.InvariantCulture);

            string newFormat = lastdate.ToString("yyyy-MM-dd");
            cmd.Parameters.AddWithValue("@checkdate", newFormat);

           connection.Open();


            Label5.Text = cmd.ExecuteScalar().ToString();

            connection.Close();