2011-04-12 92 views
0

處理C#vs 2008.我在SQL Server 2005中有一個存儲過程。使用Linq-to-SQL我執行存儲過程,但結果爲零。當我在Sql server中運行查詢時,它工作正常爲什麼存儲過程結果爲零?

exec spGetInvoiceByDate '03/01/2011 00:00:00 AM','03/31/2011 11:59:59 PM' 

上面的語法工作正常。

,這裏是我的SQL Server 存儲過程

create procedure [spGetInvoiceByDate] 
    @Beginning_Date DateTime, @Ending_Date DateTime 
as 
begin 

SELECT * INTO #temp1 FROM ( 
SELECT  convert(varchar, ManifestPort.StartDate, 1)+'-'+CASE dbo.ManifestPort.EndDate WHEN '1800-01-01 00:00:00.000' THEN 'N/A' ELSE convert(varchar, ManifestPort.EndDate, 1) END AS [Date], Manifest.VesselName, Manifest.VoyageNo, DischargePort.PortName 
, ManifestPort.Terminal, COUNT(Seal.ContainerNo) TotalContainers, 0 AS TotalHours, 0 AS TotalFee 
FROM ManifestPort 
INNER JOIN Manifest ON ManifestPort.ManifestNo = Manifest.ManifestNo 
INNER JOIN DischargePort ON ManifestPort.PortCode = DischargePort.PortCode 
INNER JOIN Seal ON ManifestPort.ManifestPortNo = Seal.ManifestPortNo 
WHERE (StartDate BETWEEN @Beginning_Date AND @Ending_Date)     
GROUP BY StartDate,EndDate, VesselName, VoyageNo, PortName, Terminal) AS a 

SELECT * INTO #temp2 FROM ( 
SELECT convert(varchar, ManifestPort.StartDate, 1)+'-'+CASE dbo.ManifestPort.EndDate WHEN '1800-01-01 00:00:00.000' THEN 'N/A' ELSE convert(varchar, ManifestPort.EndDate, 1) END AS [Date], Manifest.VesselName, Manifest.VoyageNo, DischargePort.PortName, 
ManifestPort.Terminal, COUNT(Seal.ContainerNo) STotalContainers, 0 AS STotalHours, 0 AS STotalFee 
FROM ManifestPort 
INNER JOIN Manifest ON ManifestPort.ManifestNo = Manifest.ManifestNo 
INNER JOIN DischargePort ON ManifestPort.PortCode = DischargePort.PortCode 
INNER JOIN Seal ON ManifestPort.ManifestPortNo = Seal.ManifestPortNo 
WHERE (StartDate BETWEEN @Beginning_Date AND @Ending_Date) AND Line = 'CSAV' 
GROUP BY StartDate,EndDate, VesselName, VoyageNo, PortName, Terminal ) AS b 

SELECT #temp1.Date, 
     #temp1.VesselName , 
     #temp1.VoyageNo , 
     #temp1.PortName , 
     #temp1.Terminal , 
     #temp1.TotalContainers , 
     #temp1.TotalHours , 
     #temp1.TotalFee, #temp2.STotalContainers, #temp2.STotalHours, #temp2.STotalFee FROM #temp1 INNER JOIN #temp2 
     ON #temp1.Date = #temp2.Date AND #temp1.PortName = #temp2.PortName AND #temp1.Terminal = #temp2.Terminal AND #temp1.VesselName = #temp2.VesselName 
     AND #temp1.VoyageNo = #temp2.VoyageNo 

     Order BY #temp1.VesselName, #temp1.VoyageNo 

DROP TABLE #temp1 
DROP TABLE #temp2 

end 

我用這個C#的LINQ語法執行存儲過程:

DateTime firstDayOfMonth = Convert.ToDateTime("03/01/2011"); 
DateTime lastDayOfMonth = Convert.ToDateTime("03/31/2011"); 

var results = ProviderName.spGetInvoiceByDate(firstDayOfMonth,lastDayOfMonth); 

爲什麼我總是得到的結果是零?

有人能告訴我如何減少這個問題嗎?

在此先感謝您,如果您有任何問題,請詢問。

+0

你的意思是「結果爲零」是什麼意思?什麼是'spGetInvoiceByDate'方法的返回類型? – 2011-04-12 05:27:49

+1

那麼,你需要逐步調試問題。給定那些輸入參數 - 存儲過程本身(在SQL Server Mgmt Studio中)是否返回?然後:嘗試逐個運行內部SELECT語句 - 它們實際上是否產生結果?如果不是:調查,爲什麼不。看起來像一個相當簡單和直接的調試會話 - 但沒有你的數據庫和你的表,試圖**猜**遠處發生了什麼是不可能的 – 2011-04-12 05:29:31

+0

據我所知,proc是爲了返回一個結果集不是標量,也不是過程的返回值。所以,我懷疑任何人都不知道爲什麼你期望得到一些非零值的返回值。 – Thomas 2011-04-12 05:34:01

回答

1

您是否試過用您傳遞給您的C#Linq代碼的值替換@Beginning_Date和@Ending_Date來執行存儲過程(在SQL Server Management Studio上)? 它會返回任何結果嗎? 如果它也是0,那就解釋了爲什麼你的Linq代碼返回0.

希望有幫助。

+0

存儲過程在sql server.exec上正常工作spGetInvoiceByDate '03/01/2011 00:00:00 AM','03/31/2011 11:59:59 PM'output is ok.but run on linq give result = 0 – shamim 2011-04-12 05:39:55

+0

** output is ok **?,它是否返回結果集?什麼是你在sql服務器中看到的輸出 – V4Vendetta 2011-04-12 05:42:39

+0

什麼意思是由輸出在sql server.When查詢運行在sql,比出放在網格中顯示 – shamim 2011-04-12 05:48:22

0

有什麼東西你在這裏代碼離開了......

通常一個整數的結果意味着你得到的程序,它是用來表示錯誤狀態的返回碼如果發生了(0表示一切正常),並且沒有得到結果集。

您可以發佈ProviderName.spGetInvoiceByDate(方法的代碼(即使它只是反映)嗎?我敢打賭,它在內部做了一些我們不知道的事情。

+0

我不明白你想知道什麼?謝謝你的回覆。 – shamim 2011-04-12 05:51:59

+0

該特定程序的代碼。右鍵單擊它並選擇「查看執行」 – jcolebrand 2011-04-12 06:11:17

+0

當我執行存儲過程使用查詢給我的結果集,但在Linq上運行時顯示輸出爲零。 exec spGetInvoiceByDate '03/01/2011 00:00:00 AM','03/31/2011 11:59:59 PM' – shamim 2011-04-12 06:54:42

1

正如上面Hans Kesting所提到的,您在調用SQL查詢中的存儲過程時與在代碼中調用存儲過程時使用的日期/時間不同。

exec spGetInvoiceByDate '03/01/2011 00:00:00 AM','03/31/2011 11:59:59 PM' 

將代碼中的結束日期設置爲2011年3月31日下午11:59:59。

DateTime firstDayOfMonth = Convert.ToDateTime("03/01/2011"); 
DateTime lastDayOfMonth = Convert.ToDateTime("03/31/2011 11:59:59 PM"); 

var results = ProviderName.spGetInvoiceByDate(firstDayOfMonth,lastDayOfMonth); 
0

我想這是由於日期格式不匹配造成的。請驗證參數的日期格式在C#以及SQL Server中相同。如果不匹配,您可以在存儲過程本身中轉換格式。

1

Linq to SQL不支持基於臨時表生成結果的存儲過程的代碼生成。有關更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/bb425822.aspx中的「存儲過程上的LINQ to SQL限制」部分。解決這個問題的一種方法是臨時更改存儲過程以使用普通表而不是臨時表,在Visual Studio中生成Linq to Sql代碼,然後將存儲過程更改回使用臨時表。刪除在臨時版本的存儲過程中創建的任何不需要的表。

相關問題