Ну да - вы явно указать, что вы хотите, чтобы разобрать его в формате 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 читать отделяя код от данных
Вы должны ** всегда ** ** использование параметризованных запросов ** и передать ваши параметры как 'DateTime', чтобы избежать возиться с датами в строчном формате! –