为什么存储过程结果为零

本文关键字:结果 存储过程 为什么 | 更新日期: 2023-09-27 17:49:55

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 ?

谁能告诉我如何减少这个问题?

提前感谢,如有问题请提。

为什么存储过程结果为零

您是否尝试过执行存储过程(在SQL Server Management Studio上)通过替换@Beginning_Date和@Ending_Date与您传递到您的c# Linq代码的值?它返回任何结果吗?如果它也是0,这就解释了为什么你的Linq代码返回0。

希望对你有帮助。

正如Hans Kesting上面提到的,在SQL查询中调用存储过程与通过代码调用存储过程时使用的日期/时间不同。

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

设置代码中的结束日期为March 31 2011, 11:59:59 PM。

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

Linq to SQL不支持基于临时表生成结果的存储过程的代码生成。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb425822.aspx中存储过程的LINQ to SQL限制一节。解决这个问题的一种方法是将存储过程临时更改为使用普通表而不是临时表,在Visual Studio中生成Linq to Sql代码,然后将存储过程更改回使用临时表。删除在存储过程的临时版本中创建的所有不需要的表。

你在这里的代码中遗漏了一些东西…

通常,单个整数的结果意味着您正在获得过程的返回代码,如果发生错误(0表示一切正常),则该返回代码用于指示错误状态,并且您没有获得结果集。

你可以张贴代码(即使它只是反映)的ProviderName.spGetInvoiceByDate(方法?我敢打赌它在内部做了一些我们没有意识到的事情。

我猜这是由于日期格式不匹配。请确认C#SQL Server参数的日期格式相同。如果不匹配,可以在存储过程本身中转换格式。