2012-01-19 52 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」,會發生什麼情況? –

相關問題