将DateTime SelectParameter传递给SqlDataSource

时间:2012-01-19 09:42:59

标签: c# asp.net ado.net sqldatasource

我有一个GridViewSqlDataSourceSelectCommand类似于

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 个答案:

答案 0 :(得分:4)

首先,你应该做两件事:

  1. 使用DateTime.TryParse(或DateTime.TryParseExact)。这将允许您将字符串解析为日期,以及获取有关字符串是否已成功解析的信号
  2. 提供某种格式供解析使用。硬编码的(如果您要求用户以特定格式输入日期)或传递可用于确定预期日期格式的CultureInfo
  3. 其次,您应该更改SQL查询以改为使用参数,如@ H27Studio所示。

答案 1 :(得分:2)

你必须改变

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; - )