[英]How to get stored procedure to return results when called through Linq-to-SQL
我有以下存储过程:
CREATE PROC [Scanner].[proc_AllContracts_Sel_Grid_Filter]
(@SearchText VARCHAR(500),
@CampaignStartDate DATETIME = NULL,
@CampaignEndate DATETIME = NULL,
@isPNPSelected BIT = NULL,
@isSparSelected BIT = NULL,
@isClicksSelected BIT = NULL)
AS
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN
SELECT
Sales.AccountManager.FirstName + N' ' + Sales.AccountManager.LastName AS AccountManagerName,
Sales.Contract.ContractNumber,
Sales.AccountManager.Code AS AccountManagerInitials_Code,
Client.Client.ClientName,
MAX(Sales.Burst.ChainName) AS ChainName,
MAX(Sales.Burst.BrandName) AS BrandName,
MAX(Sales.Burst.MediaName) AS MediaType,
DATEDIFF(wk, Sales.vContractDates.FirstWeek,
Sales.vContractDates.LastInstallWeek) + 1 AS CampaignTotalRunningWeeks,
ISNULL(ISNULL(Sales.vContractDates.FirstWeek, Sales.Contract.SignDate), Sales.Contract.CreationDate) AS CampaignFirstWeek,
ISNULL(ISNULL(Sales.vContractDates.LastInstallWeek, Sales.Contract.SignDate), Sales.Contract.CreationDate) AS CampaignLastWeek,
DATEADD(wk, 1, ISNULL(ISNULL(Sales.vContractDates.LastInstallWeek, Sales.Contract.SignDate),
Sales.Contract.CreationDate)) AS ContractTerminationDate,
Sales.Contract.CreatedBy,
Sales.Contract.CreationDate,
Sales.Contract.Signed,
Sales.Contract.SignedBy,
Sales.Contract.SignDate,
Sales.Contract.ContractID,
(SELECT COUNT(*) AS Expr1
FROM Sales.StoreList WITH (NOLOCK)
INNER JOIN Sales.Burst AS b WITH (NOLOCK) ON Sales.StoreList.BurstID = b.BurstID
WHERE (b.ContractID = Sales.Contract.ContractID)
AND (b.ChainName LIKE '%pick ''n pay%')) AS PNP_NumberOfStoresSelected,
(SELECT COUNT(*) AS Expr1
FROM Sales.StoreList AS StoreList_2 WITH (NOLOCK)
INNER JOIN Sales.Burst AS b WITH (NOLOCK) ON StoreList_2.BurstID = b.BurstID
WHERE (b.ContractID = Sales.Contract.ContractID)
AND (b.ChainName LIKE '%Spar%')) AS Spar_NumberOfStoresSelected,
(SELECT COUNT(*) AS Expr1
FROM Sales.StoreList AS StoreList_1 INNER JOIN
Sales.Burst AS b ON StoreList_1.BurstID = b.BurstID
WHERE (b.ContractID = Sales.Contract.ContractID) AND (b.ChainName LIKE '%Click%')) AS Clicks_NumberOfStoresSelected,
-- SELECTED FOR SCANNER DATA
ISNULL(CAST(COALESCE([PriorYear_isSelectedForScannerData], [PriorPeriod_isSelectedForScannerData], [PostPeriod_isSelectedForScannerData])AS BIT), 0) AS isSelectedForScannerData,
CAST(COALESCE([PriorYear_SelectedForScannerData_Date], [PriorPeriod_SelectedForScannerData_Date], [PostPeriod_SelectedForScannerData_Date])AS DATETIME) AS SelectedForScannerData_Date,
-- PNP READY
ISNULL(CAST(COALESCE([PriorYear_isPNPDataReadyForPRC], [PriorPeriod_isPNPDataReadyForPRC], [PostPeriod_isPNPDataReadyForPRC])AS BIT),0) AS PNP_isDataReadyForPRC,
-- SPAR READY
ISNULL(CAST(COALESCE([PriorYear_isSPARDataReadyForPRC], [PriorPeriod_isSPARDataReadyForPRC], [PostPeriod_isSPARDataReadyForPRC])AS BIT),0) AS SPAR_isDataReadyForPRC,
-- CLICKS READY
ISNULL(CAST(COALESCE([PriorYear_isCLICKSDataReadyForPRC], [PriorPeriod_isCLICKSDataReadyForPRC], [PostPeriod_isCLICKSDataReadyForPRC])AS BIT),0) AS CLICKS_isDataReadyForPRC,
-- READY DATES
CAST(COALESCE([PriorYear_PNPReadyDate], [PriorPeriod_PNPReadyDate], [PostPeriod_PNPReadyDate])AS DATETIME) AS PNP_ReadyDate,
CAST(COALESCE([PriorYear_CLICKSReadyDate], [PriorPeriod_CLICKSReadyDate], [PostPeriod_CLICKSReadyDate])AS DATETIME) AS CLICKS_ReadyDate,
CAST(COALESCE([PriorYear_SPARReadyDate], [PriorPeriod_SPARReadyDate], [PostPeriod_SPARReadyDate])AS DATETIME) AS SPAR_ReadyDate,
-- PNP SUBMISSION
ISNULL(CAST(COALESCE([PriorYear_isPNPDataSubmittedForPRC], [PriorPeriod_isPNPDataSubmittedForPRC], [PostPeriod_isPNPDataSubmittedForPRC])AS BIT),0) AS PNP_isDataSubmittedForPRC,
CAST(COALESCE([PriorYear_PNPSubmissionDate], [PriorPeriod_PNPSubmissionDate], [PostPeriod_PNPSubmissionDate])AS DATETIME) AS PNP_SubmissionDate,
-- CLICKS SUBMISSION
ISNULL(CAST(COALESCE([PriorYear_isCLICKSDataSubmittedForPRC], [PriorPeriod_isCLICKSDataSubmittedForPRC], [PostPeriod_isCLICKSDataSubmittedForPRC])AS BIT),0) AS CLICKS_isDataSubmittedForPRC,
CAST(COALESCE([PriorYear_CLICKSSubmissionDate], [PriorPeriod_CLICKSSubmissionDate], [PostPeriod_CLICKSSubmissionDate])AS DATETIME) AS CLICKS_SubmissionDate,
-- SPAR SUBMISSION
ISNULL(CAST(COALESCE([PriorYear_isSPARDataSubmittedForPRC], [PriorPeriod_isSPARDataSubmittedForPRC], [PostPeriod_isSPARDataSubmittedForPRC])AS BIT),0) AS SPAR_isDataSubmittedForPRC,
CAST(COALESCE([PriorYear_SPARSubmissionDate], [PriorPeriod_SPARSubmissionDate], [PostPeriod_SPARSubmissionDate])AS DATETIME) AS SPAR_SubmissionDate,
ISNULL(COUNT([NovaDB].[Scanner].BarcodeRequest.ID),0) AS barcodecount
FROM Client.Client INNER JOIN
Sales.Contract WITH (NOLOCK) ON Client.Client.ClientID = Sales.Contract.ClientID INNER JOIN
Sales.AccountManager WITH (NOLOCK) ON Sales.Contract.AccountManagerID = Sales.AccountManager.AccountManagerID INNER JOIN
Sales.Burst WITH (NOLOCK) ON Sales.Contract.ContractID = Sales.Burst.ContractID INNER JOIN
Sales.vVisibleContractList WITH (NOLOCK) ON Sales.Contract.ContractID = Sales.vVisibleContractList.ContractID LEFT OUTER JOIN
[NovaDB].[Scanner].[DataRequest] WITH (NOLOCK) ON Sales.Contract.ContractNumber = [NovaDB].[Scanner].[DataRequest].[ContractNumber] LEFT OUTER JOIN
Sales.vContractDates WITH (NOLOCK) ON Sales.Contract.ContractID = Sales.vContractDates.ContractID LEFT OUTER JOIN [NovaDB].[Scanner].BarcodeRequest ON [NovaDB].[Scanner].[DataRequest].ID = [NovaDB].[Scanner].BarcodeRequest.DataRequestId
WHERE (Sales.Contract.Cancelled = 0) AND (Sales.Contract.Signed = 1)
--DYNAMIC WHERE CLAUSE FOR VARIOUS PARAMETERS WHICH MAY OR MAY NOT BE PASSED IN::
AND (@CampaignStartDate IS NULL OR ISNULL(ISNULL(Sales.vContractDates.FirstWeek, Sales.Contract.SignDate), Sales.Contract.CreationDate) >= @CampaignStartDate)
AND (@CampaignEndate IS NULL OR ISNULL(ISNULL(Sales.vContractDates.LastInstallWeek, Sales.Contract.SignDate), Sales.Contract.CreationDate) <= @CampaignEndate)
-- ONLY ONE STORE CAN BE SELECTED AT A TIME
AND
(@isPNPSelected IS NULL OR @isPNPSelected = 1 OR Sales.Burst.ChainName LIKE N'%pick ''n pay%')
OR (@isSparSelected IS NULL OR @isSparSelected = 1 OR Sales.Burst.ChainName LIKE N'%Spar%')
OR (@isClicksSelected IS NULL OR @isClicksSelected =1 OR Sales.Burst.ChainName LIKE N'%Clicks%')
AND
-- FILTER BY 1.) Chain. 2)Media Type. 3) ClientName. 4) BrandName. 5) ContractNumber
(@SearchText IS NULL OR @SearchText = ''
OR Sales.AccountManager.FirstName LIKE N'%' + @SearchText + '%'
OR Sales.AccountManager.LastName LIKE N'%' + @SearchText + '%'
OR Sales.Burst.ChainName LIKE N'%' + @SearchText + '%'
OR Sales.Burst.MediaName LIKE N'%' + @SearchText + '%'
OR Client.Client.ClientName LIKE N'%' + @SearchText + '%'
OR Sales.Burst.BrandName LIKE N'%' + @SearchText + '%'
OR Sales.Contract.ContractNumber LIKE N'%' + @SearchText + '%')
GROUP BY Sales.AccountManager.FirstName + N' ' + Sales.AccountManager.LastName,
Sales.Contract.ContractNumber,
Sales.AccountManager.Code,
Client.Client.ClientName,
DATEDIFF(wk, Sales.vContractDates.FirstWeek,Sales.vContractDates.LastInstallWeek) + 1,
ISNULL(ISNULL(Sales.vContractDates.FirstWeek, Sales.Contract.SignDate), Sales.Contract.CreationDate),
ISNULL(ISNULL(Sales.vContractDates.LastInstallWeek,Sales.Contract.SignDate), Sales.Contract.CreationDate),
DATEADD(wk, 1, ISNULL(ISNULL(Sales.vContractDates.LastInstallWeek, Sales.Contract.SignDate), Sales.Contract.CreationDate)),
Sales.Contract.CreatedBy,
Sales.Contract.CreationDate,
Sales.Contract.SignedBy,
Sales.Contract.SignDate,
Sales.Contract.Signed,
Sales.Contract.ContractID,
-- SELECTED FOR SCANNER DATA
CAST(COALESCE([PriorYear_isSelectedForScannerData], [PriorPeriod_isSelectedForScannerData], [PostPeriod_isSelectedForScannerData])AS BIT),
CAST(COALESCE([PriorYear_SelectedForScannerData_Date], [PriorPeriod_SelectedForScannerData_Date], [PostPeriod_SelectedForScannerData_Date])AS DATETIME),
-- PNP READY
CAST(COALESCE([PriorYear_isPNPDataReadyForPRC], [PriorPeriod_isPNPDataReadyForPRC], [PostPeriod_isPNPDataReadyForPRC])AS BIT),
CAST(COALESCE([PriorYear_PNPReadyDate], [PriorPeriod_PNPReadyDate], [PostPeriod_PNPReadyDate])AS DATETIME),
CAST(COALESCE([PriorYear_CLICKSReadyDate], [PriorPeriod_CLICKSReadyDate], [PostPeriod_CLICKSReadyDate])AS DATETIME),
CAST(COALESCE([PriorYear_SPARReadyDate], [PriorPeriod_SPARReadyDate], [PostPeriod_SPARReadyDate])AS DATETIME),
-- PNP SUBMISSION
CAST(COALESCE([PriorYear_isPNPDataSubmittedForPRC], [PriorPeriod_isPNPDataSubmittedForPRC], [PostPeriod_isPNPDataSubmittedForPRC])AS BIT),
CAST(COALESCE([PriorYear_PNPSubmissionDate], [PriorPeriod_PNPSubmissionDate], [PostPeriod_PNPSubmissionDate])AS DATETIME),
-- CLICKS READY
CAST(COALESCE([PriorYear_isCLICKSDataReadyForPRC], [PriorPeriod_isCLICKSDataReadyForPRC], [PostPeriod_isCLICKSDataReadyForPRC])AS BIT),
-- CLICKS SUBMISSION
CAST(COALESCE([PriorYear_isCLICKSDataSubmittedForPRC], [PriorPeriod_isCLICKSDataSubmittedForPRC], [PostPeriod_isCLICKSDataSubmittedForPRC])AS BIT),
CAST(COALESCE([PriorYear_CLICKSSubmissionDate], [PriorPeriod_CLICKSSubmissionDate], [PostPeriod_CLICKSSubmissionDate])AS DATETIME),
-- SPAR READY
CAST(COALESCE([PriorYear_isSPARDataReadyForPRC], [PriorPeriod_isSPARDataReadyForPRC], [PostPeriod_isSPARDataReadyForPRC])AS BIT),
-- SPAR SUBMISSION
CAST(COALESCE([PriorYear_isSPARDataSubmittedForPRC], [PriorPeriod_isSPARDataSubmittedForPRC], [PostPeriod_isSPARDataSubmittedForPRC])AS BIT),
CAST(COALESCE([PriorYear_SPARSubmissionDate], [PriorPeriod_SPARSubmissionDate], [PostPeriod_SPARSubmissionDate])AS DATETIME)
return
END
我创建了一个LINQ To SQL dbml并将存储过程拖到它上,这就是我的调用方式:
using (var db = new Contexts.Connections().ScannerDataToolDB())
{
var allContractsList = db.proc_AllContracts_Sel_Grid_Filter(SearchText, CampaignStartDate, CampaignEndate, isPNPSelected, isSparSelected, isClicksSelected).ToList();
}
存储过程存在三个问题:
我测试了@SearchText
参数(将null传递给所有其他参数),它基本上什么也不做。 换句话说,它没有效果-无论我将其保留为空还是为它提供与列中的数据相关的值,它都会返回相同的结果(所有列)。
请帮我解决这个家伙。 我不知道是什么问题。 我试图编写“安全”动态SQL。
我遇到的第二个问题是C#代码没有中断,但是没有返回值。 0结果。 我知道问题出在查询的方式上,因为我测试了我的dbml是否可以与其他存储过程一起使用(并且它们可以很好地检索数据),包括更改此proc的主体以返回类似以下内容的内容:
Select * Sales.Contract.ContractNumber
它返回了+800 000条记录。
我测试了其他参数,它们似乎没有任何作用。
EXEC [Scanner].[proc_AllContracts_Sel_Grid_Filter]
@SearchText = '',
@CampaignStartDate = @srtDate,
@CampaignEndate = @endDate,
@isPNPSelected = 1,
@isSparSelected = 1,
@isClicksSelected = 1
该查询甚至生成以下警告消息:
警告:通过合计或其他SET操作消除了空值。
我在做什么大错特错? 请帮我。
您可以将存储过程拖到设计器上并使用它,就像在其他存储过程中看到的那样。 尝试澄清您遇到的问题。
参数是否传递到数据库? 将事件探查器附加到SQL Server实例并跟踪命令 。 您将立即可以查看是否有任何内容传递给您的存储过程。
直接从SQL Management Studio测试您的存储过程。 它行得通吗?
假设您的SQL有效,请记录要发送的命令 。 LINQ-to-SQL轻松输出它发送的每个命令。 如果命令符合预期,则表明您的存储过程可疑。 如果命令与预期不符,则说明您的C#是可疑的。
调试LINQ-to-SQL代码。 dbml文件生成许多可以调试的类。 在其中放置一些断点,并检查您传递的参数。
看起来您正在将类传递给方法( SearchText, CampaignStartDate, CampaignEndate
),但我强烈怀疑您的大小写不一致。 除非对传递的这些对象的属性进行巧妙的处理,否则这应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.