2017-05-08 96 views
1

我從C#ASP.NET應用程序(MVC 3)運行SQL Server 2014存儲過程時遇到問題。 當我用相同的參數手動運行此過程時,它會返回所有正確的結果。當程序從C#應用程序執行時,「reader」變空,沒有任何數據。這似乎是DateTime格式的問題。我應該怎麼做才能解決它? 下面是代碼:StoredProcedure上的DateTime格式問題 - C#ASP.NET x MS SQL Server 2014

SQL:

ALTER PROCEDURE [dbo].[my_proc] 
(
    @client_code AS varchar(7), 
    @begin_date AS datetime, 
    @end_date AS datetime 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 


SELECT * 
    from [dbo].[my_table] c 
    WHERE c.code = @client_code 
    AND c.date1 >= @begin_date 
    AND c.date2 <= @end_date 

END 

C#:

DateTime Today = DateTime.Today; 
DateTime LastYear = Today.AddYears(-1); 
sql = new SqlConnection(/*my string connection*/); 
sql.Open(); 
adapter.SelectCommand = new SqlCommand(); 
adapter.SelectCommand.CommandText = "dbo.my_proc"; 
adapter.SelectCommand.Connection = sql; 
adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 

param1 = adapter.SelectCommand.Parameters.Add("@client_code", SqlDbType.VarChar); 
param1.Value = cod_client; 

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date); 
param2.Value = LastYear.ToString("yyyy-MM-dd"); 

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date); 
param3.Value = Today.ToString("yyyy-MM-dd"); 

reader = adapter.SelectCommand.ExecuteReader(); 
+1

'的ToString( 「...」)'?不,你會遇到問題。如果你想刪除時間部分,使用'SqlDbType.DateTime'並使用'Today.Date' –

+0

你期望DateTime類型的參數,爲什麼你將完美適合的日期時間變量轉換爲字符串? – Steve

+0

我害怕C#和SQL Server之間的日期時間格式不匹配,所以我試圖通過toString方法來管理格式。 –

回答

1

你不應該轉換DateTime字符串。只是將它「按原樣」傳遞給存儲過程。如果你想要日期部分,然後使用Date。請記住不要更改數據類型。

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date); 
param2.Value = LastYear.Date; 

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date); 
param3.Value = Today.Date; 
+0

我試過這種方式,它不像預期的那樣工作。我害怕日期時間格式不匹配。 –

+0

我長時間使用這種方式。你能解釋一下哪裏出了問題嗎? – David

+0

該過程在從C#應用程序執行時返回空。但是,當我使用相同的參數直接從SQL Server手動運行該過程時,將返回所有正確的行。 –

0

嘗試AddWithValue方法至極看起來更簡潔和可識別的飛行參數的數據類型:

 adapter.SelectCommand.Parameters.AddWithValue("@client_code", cod_client); 
     adapter.SelectCommand.Parameters.AddWithValue("@begin_date", LastYear.Date); 
     adapter.SelectCommand.Parameters.AddWithValue("@end_date", Today.Date); 
+1

這不會解決根本問題(發送日期值爲文本),最重要的是[AddWithValue無論如何都是不好的練習](http:///blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)。 – Alejandro