访问 asp.net 中的日期时出错

本文关键字:日期 出错 asp net 访问 | 更新日期: 2023-09-27 18:30:27

DateTime startDate = DateTime.ParseExact(txtstart.Text, "yyyyMMdd", null);
DateTime endDate = DateTime.ParseExact(txtend.Text, "yyyyMMdd", null);
SqlDataAdapter adapter = new SqlDataAdapter(
  "select * from Membership_det where updateDate  between "+ 
      startDate.ToString() + " and "+ endDate.ToString() +" ", con);

它给出错误:

字符串未被识别为有效的日期时间。在 中输入日期时 月/日/年格式

访问 asp.net 中的日期时出错

嗯,

是的 - 你明确指定要以yyyyMMdd格式解析它。我不明白如果您实际上以MM/dd/yyyy格式指定了它,为什么您会期望它起作用。如果要改为处理它,请更改解析代码:

DateTime startDate = DateTime.ParseExact(txtstart.Text, "MM/dd/yyyy",
                                         CultureInfo.InvariantCulture);
DateTime endDate = DateTime.ParseExact(txtend.Text, "MM/dd/yyyy",
                                       CultureInfo.InvariantCulture);

然而:

  • 如果这是解析用户输入,则应改用DateTime.TryParseExact,以便可以在正常流中检测输入中的错误,而不是使用异常。
  • 这段代码非常以美国为中心;非美国用户可能会发现它令人困惑。通常,最好使用标准日期格式(和用户的区域性)之一,甚至最好使用某种形式的日期选取器控件,以避免整个文本格式问题。

接下来,您将直接在 SQL 语句中使用这些值。别这样。始终、始终、始终使用参数化 SQL:

SqlDataAdapter adapter = new SqlDataAdapter(
    "select * from Membership_det where updateDate  between @Start and @End",
    con);
adapter.SelectCommand.Parameters.Add("@Start", SqlDbType.Date).Value = startDate;
adapter.SelectCommand.Parameters.Add("@End", SqlDbType.Date).Value = endDate;

(或者先创建命令,然后将其传递给适配器。

使用参数化 SQL 有三个好处:

  • 它避免了SQL注入攻击
  • 它避免了数据转换问题(在日期中很常见)
  • 它通过将代码与数据分开来使您的 SQL 易于阅读

仅访问数据库

DateTime startDate = DateTime.ParseExact(txtstart.Text, "MMddyyyy", null);
DateTime endDate = DateTime.ParseExact(txtend.Text, "MMddyyyy", null);
SqlDataAdapter adapter = new SqlDataAdapter(
  "select * from Membership_det where format( updateDate,'MM/dd/yyyy')  between '"+ 
      startDate.ToString("MM/dd/yyyy") + "' and '"+ endDate.Tostring("MM/dd/yyyy") +"' ", con);

SQL 服务器

DateTime startDate = DateTime.ParseExact(txtstart.Text, "MMddyyyy", null);
DateTime endDate = DateTime.ParseExact(txtend.Text, "MMddyyyy", null);
SqlDataAdapter adapter = new SqlDataAdapter(
  "select * from Membership_det where Convert(varchar(15), updateDate,106)  between '"+ 
      startDate.ToString(dd MMM yyyy) + "' and '"+ endDate.Tostring(dd MMM yyyy) +"' ", con);