繁体   English   中英

通过Linq-to-SQL调用时如何获取存储过程以返回结果

[英]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();
}

存储过程存在三个问题:

  1. 我测试了@SearchText参数(将null传递给所有其他参数),它基本上什么也不做。 换句话说,它没有效果-无论我将其保留为空还是为它提供与列中的数据相关的值,它都会返回相同的结果(所有列)。

    请帮我解决这个家伙。 我不知道是什么问题。 我试图编写“安全”动态SQL。

  2. 我遇到的第二个问题是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操作消除了空值。

我在做什么大错特错? 请帮我。

您可以将存储过程拖到设计器上并使用它,就像在其他存储过程中看到的那样。 尝试澄清您遇到的问题。

  1. 参数是否传递到数据库? 将事件探查器附加到SQL Server实例并跟踪命令 您将立即可以查看是否有任何内容传递给您的存储过程。

  2. 直接从SQL Management Studio测试您的存储过程。 它行得通吗?

  3. 假设您的SQL有效,请记录要发送的命令 LINQ-to-SQL轻松输出它发送的每个命令。 如果命令符合预期,则表明您的存储过程可疑。 如果命令与预期不符,则说明您的C#是可疑的。

  4. 调试LINQ-to-SQL代码。 dbml文件生成许多可以调试的类。 在其中放置一些断点,并检查您传递的参数。

看起来您正在将传递给方法( SearchText, CampaignStartDate, CampaignEndate ),但我强烈怀疑您的大小写不一致。 除非对传递的这些对象的属性进行巧妙的处理,否则这应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM