L'exécution d'une procédure stockée avec Dapper ne returnne pas les en-têtes de colonne si aucune ligne n'est présente

J'exécute une procédure stockée avec dapper qui returnne la requête de pivot dynamic, les colonnes. J'ai remarqué que s'il n'y a aucun résultat, dapper ne returnne même pas les en-têtes de colonnes. J'imprime mes résultats pour excel et s'il n'y a pas de lignes, c'est bien, mais je voudrais quand même imprimer l'en-tête de la colonne.

Donc, par exemple, si cela est returnné à partir du Sproc, seulement les en-têtes de colonnes

TSBNumber System1 System2 System3

L'obs suivante, count est 0 mais j'ai encore besoin d'get les en-têtes de colonne. Est-ce possible ou est-ce que je devrais manuellement append les en-têtes de colonne à mon datatable quand il n'y a aucun résultat? Ou Devrais-je append une ligne vide dans mon SQL afin dapper obtiendra un count de 1 et imprimer?

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.SplitSsortingngs_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) 

En effet, Query ne le fait pas, car il n'a aucune ligne sur laquelle attacher des métadonnées. Il existe une méthode ExecuteReader, mais à ce stade vous ne gagnez pas beaucoup sur ADO.NET, à less que j'ajoute une méthode pour transformer un IDataReader en une série de lignes dynamic ou matériiliser dans un certain type. Je pourrais append ces choses – il faut juste du travail.