C# 在asp.net中访问日期时出错
它给出了错误: 字符串未被识别为有效的日期时间。在中输入日期时 mm/dd/yyyy格式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
是的-您明确指定要以
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
- 该代码非常以美国为中心;非美国用户可能会感到困惑。一般来说,您最好使用一种标准日期格式(以及用户的文化),或者更好地使用某种表单的日期选择器控件,以避免开始时出现整个文本格式的问题
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);