Dapper로 저장 프로 시저를 실행하면 행이 없으면 열 머리글이 반환됩니다.

asp.net-mvc dapper sql-server

문제

동적 피벗 쿼리, 열을 반환하는 dapper를 사용하여 저장 프로 시저를 실행 중입니다. 나는 결과가 없으면 위퍼는 열 머리글을 반환하지 않는다는 것을 알았다. 내 결과를 Excel로 인쇄하고 행이 없으면 괜찮습니다.하지만 여전히 열 머리글을 인쇄하고 싶습니다.

예를 들어 Sproc에서 반환되는 경우에는 열 머리글 만

TSB 번호 시스템 1 시스템 2 시스템 3

다음 obs, count는 0이지만 여전히 열 머리글을 가져와야합니다. 이것이 가능합니까 아니면 결과가 없을 때 열 머리글을 내 데이터 테이블에 수동으로 추가해야합니까? 아니면 내 SQL에 빈 행을 추가하여 대퍼가 1의 카운트를 얻고 출력 할 수 있습니까?

   var obs = cnn.Query(sql: "spExportServiceTSB", param: p, commandType: CommandType.StoredProcedure);


  var p = new DynamicParameters();
            p.Add("@StartDate", StartDate);
            p.Add("@EndDate", EndDate);
            p.Add("@SelectedSystemIDs", SelectedSystemIDs);
            p.Add("@SelectedTsbIDs", SelectedTsbIDs);
            p.Add("@UserRoleID", UserRoleID);
            var obs = cnn.Query(sql: "spExportServiceTSB", param: p, commandType: CommandType.StoredProcedure);

            var dt = ToDataTable(obs);

            return ExportDatatableToHtml(dt);

Sproc

ALTER PROCEDURE  [dbo].[spExportServiceTSB]                            
(@StartDate datetime,                            
@EndDate datetime,                                   
@SelectedSystemIDs nvarchar (2000) = NULL,    
@SelectedTsbIDs nvarchar (2000) = NULL,   
@UserRoleID int
)                            
AS                            

DECLARE @PlatformID INT = NULL

IF(@SelectedSystemIDs = '')
BEGIN
SET @SelectedSystemIDs = NULL
END

IF(@SelectedTsbIDs = '')
BEGIN
SET @SelectedTsbIDs = '0'
END

IF(@UserRoleID = 1)    
 BEGIN     
  SET @PlatformID = 1     
  END  

IF(@UserRoleID = 2)  
BEGIN  
SET @PlatformID = 2  
END  

IF (@UserRoleID = 3)    
BEGIN    
SET @PlatformID = 12    
END   

IF(@UserRoleID = 4)
BEGIN 
SET @PlatformID = 3
END

IF(@UserRoleID = 5)
BEGIN 
SET @PlatformID = 4
END

IF(@UserRoleID = 6)
BEGIN 
SET @PlatformID = 0
END

DECLARE @PivotColumnHeaders NVARCHAR(MAX)

SELECT @PivotColumnHeaders =  
   COALESCE(
     @PivotColumnHeaders + ',[' +  cast(SystemFullName as Nvarchar) + ']',
     '[' + cast(SystemFullName as varchar)+ ']'
   )
FROM System 
WHERE (@SelectedSystemIDs IS NULL OR  System.ID IN(select  * from dbo.SplitInts_RBAR_1(@SelectedSystemIDs, ',')))     
AND ((@PlatformID =0) OR  (System.PlatformID = @PlatformID) OR (@PlatformID = 12 AND System.PlatformID <= 2))  

DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'
   SELECT *
   FROM (
     SELECT
       TSBNumber [TSBNumber],
       SystemFullName,
       ClosedDate
     FROM ServiceEntry 
     INNER JOIN System 
       ON ServiceEntry.SystemID = System.ID
     where
      (ServiceEntry.TSBNumber IS NOT NULL)
       AND 
       (ServiceEntry.ClosedDate IS NOT NULL)
       AND
       ( 
       (''' + @SelectedTsbIDs + ''' = '''+ '0' + ''') OR
         (ServiceEntry.TSBNumber in (select * from dbo.SplitStrings_Moden(''' + @SelectedTsbIDs + ''', ''' + ',' + ''')))
        )  
        AND (
         (''' + CAST(@PlatformID AS VARCHAR(10)) + ''' = '''+ '0' + ''') 
        OR(System.PlatformID = ''' + cast(@PlatformID as varchar(10)) + ''')
        --OR(''' + CAST(@PlatformID AS VARCHAR(10)) + ''' = ''' + '12' + ''' AND System.PlatformID <=  ''' + '2' + ''')
        )
        AND
        (ServiceEntry.ClosedDate between ''' + convert(varchar(10), @StartDate, 120)  + '''  and   ''' +  convert(varchar(10), @EndDate, 120) + ''')

   ) AS PivotData
   PIVOT (
     MAX(ClosedDate)
     FOR SystemFullName IN (
       ' + @PivotColumnHeaders + '
     ) 
   ) AS PivotTable
' 



EXECUTE (@PivotTableSQL)
--print (@PivotTableSQL)

수락 된 답변

실제로 메타 데이터를 첨부 할 행이 없으므로 Query는 그렇지 않습니다. ExecuteReader 메서드가 있지만 그 시점에서 IDataReader를 일련의 dynamic 행으로 전환하거나 일부 유형으로 매치하는 메서드를 추가하지 않으면 ADO.NET보다 많은 것을 얻지 못합니다. 나는 그런 것들을 추가 할 수 있습니다 - 단지 일을합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.