Почему результат хранимой процедуры равен нулю? - PullRequest
0 голосов
/ 12 апреля 2011

Работа на C # vs 2008. У меня есть хранимая процедура в SQL Server 2005. Используя Linq-to-SQL, я выполняю хранимую процедуру, но результат равен нулю.Когда я запускаю запрос на сервере Sql, он отлично работает

 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);

Почему я всегда получаю результат, равный нулю?

Кто-нибудь может сказать, какуменьшить проблему?

Заранее спасибо, если у вас есть какие-либо вопросы, пожалуйста, спросите.

Ответы [ 5 ]

1 голос
/ 17 декабря 2011

Linq to SQL не поддерживает генерацию кода для хранимых процедур, которые выдают результаты на основе временных таблиц.См. Ограничения LINQ to SQL для хранимых процедур в http://msdn.microsoft.com/en-us/library/bb425822.aspx для получения дополнительной информации.Один из способов обойти это - временно изменить хранимую процедуру, чтобы использовать обычные таблицы вместо временных таблиц, сгенерировать код Linq to Sql в Visual Studio, а затем снова изменить хранимую процедуру на использование временных таблиц.Удалите все ненужные таблицы, созданные во временной версии хранимой процедуры.

1 голос
/ 12 апреля 2011

Как упомянуто выше Хансом Кестингом, вы не используете ту же дату / время при вызове хранимой процедуры в вашем запросе SQL и при вызове через код.

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

Установитедата окончания в коде до 31 марта 2011 года, 23: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);
1 голос
/ 12 апреля 2011

Вы пытались выполнить сохраненный процесс (в SQL Server Management Studio), заменив @Beginning_Date и @Ending_Date значениями, которые вы передаете в код C # Linq? Это возвращает какой-либо результат? Если это также 0, это объясняет, почему ваш код Linq возвращает 0.

Надеюсь, это поможет.

0 голосов
/ 17 декабря 2011

Полагаю, это связано с несовпадением формата даты.Убедитесь, что формат даты параметров такой же как в C#, так и в SQL Server.В случае несоответствия вы можете конвертировать формат в самой хранимой процедуре.

0 голосов
/ 12 апреля 2011

Здесь есть что-то, что вы пропускаете в коде ...

Обычно результат одного целого числа означает, что вы получаете код возврата процедуры, который используется для обозначения ошибкиукажите, произошла ли одна (0 означает, что все было хорошо), и вы не получаете набор результатов.

Можете ли вы опубликовать код (даже если он только что отражен) метода ProviderName.spGetInvoiceByDate(?Я готов поспорить, что он делает что-то внутренне, о чем мы не знаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...