C# 在asp.net中访问日期时出错

C# 在asp.net中访问日期时出错,c#,asp.net,C#,Asp.net,它给出了错误: 字符串未被识别为有效的日期时间。在中输入日期时 mm/dd/yyyy格式 是的-您明确指定要以yyyyMMdd格式解析它。我不明白,如果您实际以MM/dd/yyyy格式指定了它,为什么您会期望它工作。如果要处理此问题,请更改解析代码: DateTime startDate = DateTime.ParseExact(txtstart.Text, "yyyyMMdd", null); DateTime endDate = DateTime.ParseExact(txtend.Tex

它给出了错误:

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


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

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);
然而:

  • 如果这是解析用户输入,则应改用
    DateTime.TryParseExact
    ,以便在正常流中检测输入中的错误,而不是使用异常
  • 该代码非常以美国为中心;非美国用户可能会感到困惑。一般来说,您最好使用一种标准日期格式(以及用户的文化),或者更好地使用某种表单的日期选择器控件,以避免开始时出现整个文本格式的问题
接下来,您将直接在SQL语句中使用这些值不要这样做。始终,始终,始终使用参数化SQL:

DateTime startDate = DateTime.ParseExact(txtstart.Text, "MM/dd/yyyy",
                                         CultureInfo.InvariantCulture);
DateTime endDate = DateTime.ParseExact(txtend.Text, "MM/dd/yyyy",
                                       CultureInfo.InvariantCulture);
(或者先创建命令,然后将其传递给适配器。)

使用参数化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 Server

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

以防万一,我想知道…在代码中是否使用了CultureInfo.InvariantCulture…?\@user2660112:当您指定自定义日期格式时,您几乎也应该明确指定区域性。您正在有效地指定以美国为中心的日期格式,因此将所有日期都视为以美国为中心是有意义的。您应该始终使用参数化查询,并将参数作为
DateTime
传递,以避免在字符串格式的日期上乱动!
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);