簡體   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