0
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。以 mm/dd/yyyy 格式输入日期时

4

2 回答 2

1

是的 - 您明确指定要以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 易于阅读
于 2013-09-07T09:14:53.087 回答
0

仅访问数据库

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);
于 2013-09-07T15:16:54.357 回答