Передача DateTime SelectParameter в SqlDataSource - PullRequest
1 голос
/ 19 января 2012

У меня есть GridView и SqlDataSource для него.SelectCommand это что-то вроде

SELECT * FROM Transfers WHERE Timestamp >= '{0}' AND Timestamp <= '{1}'

Параметры SqlDataSource:

<SelectParameters>
    <asp:Parameter Name="StartDate" Type="DateTime" />
    <asp:Parameter Name="EndDate" Type="DateTime" />
</SelectParameters>

Затем в коде позади я устанавливаю следующие параметры:

protected void gvTransfers_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    e.Command.Parameters["@StartDate"].Value = DateTime.Parse(txtStartDate.Text);
    e.Command.Parameters["@EndDate"].Value = DateTime.Parse(txtEndDate.Text);
}

Я отлаженкод выше, и он работает и устанавливает хорошие DateTime значения.Но когда GridView привязывается к базе данных, возникает исключение

Conversion failed when converting date and/or time from character string.

Я часами смотрел, как правильно передать DateTime.Что я делаю неправильно?Стоит ли менять SQL, разметку или код позади?

Я также пытался FilterParameters и получать даты из текстовых полей в различных форматах, но безуспешно.

Ответы [ 2 ]

4 голосов
/ 19 января 2012

Во-первых, вы должны сделать две вещи:

  1. Использовать DateTime.TryParse (или DateTime.TryParseExact).Это позволит вам разобрать строку в дату, а также получить сигнал о том, была ли строка успешно проанализирована или нет
  2. Предоставить какой-то формат для анализа.Либо жестко закодированный (если вам требуется, чтобы пользователь вводил дату в определенном формате), либо путем передачи CultureInfo, который можно использовать для определения ожидаемого формата даты.

Во-вторых, вы должны изменить SQL-запрос, чтобы использовать вместо него параметры, как предложено @ H27Studio.

2 голосов
/ 19 января 2012

Вы должны изменить

SELECT * FROM Transfers WHERE Timestamp >= '{0}' AND Timestamp <= '{1}'

на

SELECT * FROM Transfers WHERE Timestamp >= @StartDate AND Timestamp <= @EndDate

Для получения дополнительной информации вы можете проверить это сообщение MSDN: http://msdn.microsoft.com/en-us/library/z72eefad.aspx; -)

...