2013-09-07 3 views
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); 

Это дает ошибку:Ошибка при доступе к дате в asp.net

String was not recognized as a valid DateTime.When date is entered in mm/dd/yyyy format

+0

Вы должны ** всегда ** ** использование параметризованных запросов ** и передать ваши параметры как 'DateTime', чтобы избежать возиться с датами в строчном формате! –

ответ

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 имеет три преимущества:

  • It avoids SQL injection attacks
  • Он избегает проблем с преобразованием данных (которые являются общими с датами)
  • Это упрощает работу с SQL читать отделяя код от данных
+0

На всякий случай, я хочу знать ... есть ли использование CultureInfo.InvariantCulture ...? В коде ..? \ –

+0

@ user2660112: Когда вы укажете пользовательский формат даты, вы должны почти всегда указывать культуру явно слишком. Вы эффективно определяете формат даты в США, поэтому имеет смысл рассматривать все это как ориентированное на США. –

+0

ya ... его рабочий ... –

0

Access DB Только

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 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 Convert(varchar(15), updateDate,106) between '"+ 
     startDate.ToString(dd MMM yyyy) + "' and '"+ endDate.Tostring(dd MMM yyyy) +"' ", con); 
Смежные вопросы