2012-01-19 46 views
1

我有一个GridViewSqlDataSource它。 SelectCommand是类似的SqlDataSource将DateTime SelectParameter传递给SqlDataSource

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

参数:

<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并从各种格式的文本框中获取日期,但没有成功。

+0

您使用的是哪种sql server版本 – Devjosh

+0

您是否尝试过使用DateTime.Parse(txtStartDate.Text).ToString(“dd-MMM-yyyy”)? – 2012-01-19 09:45:33

+0

Sql Server 2008 R2 – Episodex

回答

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

+1

谢谢!现在没有例外:)。但看起来结果没有被正确过滤,我现在会进行调查。我使用了'{0}'格式,因为'FilterParameters'使用它,我没有注意到'SelectParameters'的不同。令人困惑... – Episodex

+1

好吧,我的错误,现在它是完美的。 – Episodex

4

首先,有两件事情你应该做的:

  1. 使用DateTime.TryParse(或DateTime.TryParseExact)。这将允许您将字符串解析为日期,以及获取关于字符串是否被成功解析的信号
  2. 提供某种格式的解析使用。可以是硬编码格式(如果您要求用户以特定格式输入日期),也可以传递可用于确定预期日期格式的CultureInfo

其次,您应该更改SQL查询以使用参数,而不是像@ H27Studio所建议的那样。

+0

后面的代码转换进行得很顺利,我检查了它。我还检查了'e.Command.Parameters [“@ StartDate”](和EndDate)的值,并且它们都已设置好。错误来自SQL Server。 – Episodex

+0

那是因为SQL Server获取“{0}”和“{1}”作为日期时间而不是真正的日期。 – H27studio

+1

@Episodex:确切地说,这是参数问题。不过,你的解析代码非常脆弱:例如,如果我在其中一个文本框中输入“not a date”,会发生什么情况? –

相关问题