2014-02-19 38 views
2

我在接受日期參數的d1,d2是c#DateTime類型的sql服務器db上調用存儲過程。我使用的是實體框架這樣做:使用實體框架存儲過程的日期參數

context.Database.ExecuteSqlCommand("myprocedure @p1 @p2",dt1.Date,dt2.Date) 

它沒有返回結果,所以我嘗試:

var p0 = new SqlParameter("p0",dt1); 
p0.SqlDbType = SqlDbType.Date; 
var p1= new SqlParameter("p1", dt2); 
p1.SqlDbType = SqlDbType.Date; 
context.Database.ExecuteSqlCommand("myprocedure @p1 @p2",p0,p1) 

但是,如果我簡單地做:

context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", '1/20/2014', '1/30/2014') 

我得到正確的結果。請幫助..在這裏我想起了。

回答

0

您的日期還包括時間。要做到這一點:

context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", '1/20/2014', '1/30/2014') 

你需要這樣做:

context.Database.ExecuteSqlCommand("myprocedure @p1 @p2",dt1.Date.ToShortDateString() , dt2.Date.ToShortDateString()) 

這是因爲我認爲你需要SP的字符串,而不是爲DateTime類型。

請注意,日期字符串的格式取決於文化。您可能需要使用.ToString()方法手動指定MM/dd/YYYY格式等,以確保SP獲得正確的格式化日期。


此外,它看起來不像你正在使用實體框架。在實體框架對象上應該有一個名爲MyProcedure的方法,您可以直接調用並傳遞參數。

-1

嘗試轉換的DT1和DT2第一,前值發送到參數

dt1= Convert.ToDateTime(DateTime.Now.ToString("MM/dd/YYYY"); 
dt2= Convert.ToDateTime(DateTime.Now.ToString("MM/dd/YYYY"); 
+0

如果你想獲得一個DateTime值的日期部分,調用'.Date'財產。您的代碼實際上會失敗,因爲您使用本地化格式(僅限美國),而不是明確的'yyyy-MM-dd'。 –

+0

@PanagiotisKanavos你可以將格式從MM/dd/YYYY更改爲任何你需要的格式...爲什麼你讓問題更復雜?... lol – cyan

+0

日期沒有格式。它們是二進制值。實際上,不考慮語言環境的多次轉換使事情變得更加複雜。 –

-1

問題:您提供的格式不究竟DB期待。

解決方案:最好將字符串轉換爲DateTime類型併發送。

替換此:

context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", '1/20/2014', '1/30/2014') 

這一點:

DateTime dt1=DateTime.ParseExact("1/20/2014","M/d/yyyy",CultureInfo.InvariantCulture); 
DateTime dt1=DateTime.ParseExact("1/30/2014","M/d/yyyy",CultureInfo.InvariantCulture); 
context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", dt1,dt2); 
+0

OP已經嘗試使用DateTime值。這失敗了,因爲存儲過程接受字符串參數而不是日期參數 –