Como migrar do SSRS para o IronPDF em C#
A migração do SQL Server Reporting Services (SSRS) para o IronPDF transforma seu fluxo de trabalho de geração de PDFs, passando de uma infraestrutura complexa baseada em servidor para uma biblioteca leve e integrada ao processo, que pode ser incorporada diretamente em qualquer aplicação .NET . Este guia fornece um caminho de migração completo, passo a passo, que elimina as dependências do SQL Server, a sobrecarga do servidor de relatórios e a dependência do ecossistema da Microsoft.
Por que migrar doSSRSpara o IronPDF?
Entendendo o SSRS
SQL Server Reporting Services (SSRS) é a plataforma de relatórios empresariais da Microsoft — um conjunto completo para criar, implantar e gerenciar relatórios, integrado de perto com o ecossistema do SQL Server. A Microsoft confirmou que SSRS 2022 é a última versão independente: a partir do SQL Server 2025, os relatórios localizados são consolidados no Power BI Report Server (PBIRS), e não serão lançadas novas versões do SSRS. OSSRS2022 recebe atualizações de segurança até 11 de janeiro de 2033, em linha com o ciclo de vida do SQL Server 2022 (veja as Perguntas Frequentes sobre a Consolidação de Serviços de Relatórios).
Para muitos cenários de geração de PDF, a infraestrutura doSSRSé excessiva. As principais razões para migrar incluem:
- Fim da linha do SSRS: O SQL Server 2025 é lançado sem SSRS; PBIRS o substitui. Novo trabalho direcionado aoSSRSé um beco sem saída.
- Infraestrutura Pesada: Requer SQL Server, Report Server e (para o visualizador Web Forms mais antigo) configuração do IIS
- Dependência do Ecossistema Microsoft: Vinculado ao licenciamento do SQL Server e Windows Server
- Implantação Complexa: Implantação de relatórios, configuração de segurança e gerenciamento de assinaturas
- Licenciamento Caro: Licenças do SQL Server, especialmente para recursos empresariais
- Sem Suporte First-Class for .NET Core: Os pacotes
Microsoft.ReportingServices.ReportViewerControl.WebForms/.Winformsda Microsoft têm como alvo apenas o .NET Framework 4.0–4.8.1. Usuários do .NET Core / .NET 5+ dependem da portabilidade da comunidadeReportViewerCore.NETCore. - Sobrecarga de Manutenção: Patching do servidor, manutenção do banco de dados, gerenciamento de relatórios
- Sem Opção Nativa na Nuvem: Projetado para ambientes locais, o suporte na nuvem é desajeitado
Quando oSSRSé exagerado
| Sua necessidade | Visão geral doSSRS |
|---|---|
| Gerar faturas | Servidor de relatório completo |
| Exportar tabelas de dados | Licença do SQL Server |
| Criar PDFs a partir de dados | Servidor Windows |
| Geração simples de documentos | Assinaturas de relatórios |
O IronPDF oferece geração de PDFs em tempo real, sem a necessidade de infraestrutura de servidor.
Comparação entreSSRSe IronPDF
| Recurso | SSRS | IronPDF |
|---|---|---|
| Dependência | Requer o SQL Server. | Sem dependência específica de banco de dados |
| Implantação | Baseado em servidor | Biblioteca (incorporada em aplicativos) |
| Integração | Integração estreita com a Microsoft | Funciona com qualquer fonte de dados. |
| Visualização de dados | Ampla variedade de opções nativas | Visualizações focadas em PDF |
| Complexidade | Alta (configuração do servidor necessária) | Moderado a baixo (configuração da biblioteca) |
| Custo | custos de licenciamento do SQL Server | Custo de licenciamento por desenvolvedor |
| HTML para PDF | Não | Cromo completo |
| URL para PDF | Não | Sim |
| Suporte a CSS | Limitado | CSS3 completo |
| JavaScript | Não | ES2024 completo |
O IronPDF, diferentemente do SSRS, não está vinculado a nenhum banco de dados ou ecossistema de servidor específico. Ela fornece aos desenvolvedores uma biblioteca flexível para criar, editar e manipular documentos PDF dinamicamente diretamente em C#. Essa separação de uma infraestrutura baseada em servidor oferece uma vantagem notável: é simples e adaptável, adequada para uma ampla gama de aplicações além da geração de relatórios.
Para equipes adotando o .NET moderno, o IronPDF fornece um mecanismo de renderização baseado em Chromium que elimina a complexidade da infraestrutura do SSRS.
Antes de começar
Pré-requisitos
- Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
- Licença do IronPDF: Obtenha sua chave de licença em IronPDF
Alterações no pacote NuGet
#SSRSitself is server-based, but the in-process LocalReport API
# ships via Microsoft's ReportViewerControl packages (latest 150.1652.0,
# June 2024 — .NET Framework 4.0–4.8.1 only).
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WebForms
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.Winforms
# If your project used the community .NET Core port, remove it too:
# dotnet remove package ReportViewerCore.NETCore
# Install IronPDF
dotnet add package IronPdf
#SSRSitself is server-based, but the in-process LocalReport API
# ships via Microsoft's ReportViewerControl packages (latest 150.1652.0,
# June 2024 — .NET Framework 4.0–4.8.1 only).
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WebForms
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.Winforms
# If your project used the community .NET Core port, remove it too:
# dotnet remove package ReportViewerCore.NETCore
# Install IronPDF
dotnet add package IronPdf
Configuração de licença
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Referência completa da API
Alterações de namespace
// Before: SSRS
using Microsoft.Reporting.WebForms;
using Microsoft.Reporting.WinForms;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: SSRS
using Microsoft.Reporting.WebForms;
using Microsoft.Reporting.WinForms;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports Microsoft.Reporting.WebForms
Imports Microsoft.Reporting.WinForms
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
Mapeamentos da API principal
| ConceitoSSRS | Equivalente ao IronPDF | Notas |
|---|---|---|
LocalReport |
ChromePdfRenderer |
Renderização principal |
ServerReport |
RenderUrlAsPdf() |
renderização baseada em URL |
arquivos .rdlc |
Modelos HTML/CSS | Formato do modelo |
ReportParameter |
Interpolação de strings | Parâmetros |
ReportDataSource |
Dados em C# + HTML | Vinculação de dados |
LocalReport.Render("PDF") |
RenderHtmlAsPdf() |
Saída em PDF |
SubReport |
PDFs mesclados | Relatórios aninhados |
Report Server URL |
Não é necessário | Não é necessário servidor |
controle ReportViewer |
Não é necessário | Geração direta de PDF |
| Formatos de exportação | O PDF é nativo | Produção focada |
Exemplos de migração de código
Exemplo 1: Conversão de HTML para PDF
Antes (SSRS):
//SSRS- SQL Server Reporting Services
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;
using System.IO;
class SSRSHtmlToPdf
{
static void Main()
{
// Create a ReportViewer instance
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
// Load RDLC report definition
reportViewer.LocalReport.ReportPath = "Report.rdlc";
// Add HTML content as a parameter or dataset
var htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>";
var param = new ReportParameter("HtmlContent", htmlContent);
reportViewer.LocalReport.SetParameters(param);
// Render the report to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF",
null,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
File.WriteAllBytes("output.pdf", bytes);
}
}
//SSRS- SQL Server Reporting Services
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;
using System.IO;
class SSRSHtmlToPdf
{
static void Main()
{
// Create a ReportViewer instance
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
// Load RDLC report definition
reportViewer.LocalReport.ReportPath = "Report.rdlc";
// Add HTML content as a parameter or dataset
var htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>";
var param = new ReportParameter("HtmlContent", htmlContent);
reportViewer.LocalReport.SetParameters(param);
// Render the report to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF",
null,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
File.WriteAllBytes("output.pdf", bytes);
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Reporting.WebForms
Imports System.IO
Class SSRSHtmlToPdf
Shared Sub Main()
' Create a ReportViewer instance
Dim reportViewer As New ReportViewer()
reportViewer.ProcessingMode = ProcessingMode.Local
' Load RDLC report definition
reportViewer.LocalReport.ReportPath = "Report.rdlc"
' Add HTML content as a parameter or dataset
Dim htmlContent As String = "<h1>Hello World</h1><p>This is HTML content.</p>"
Dim param As New ReportParameter("HtmlContent", htmlContent)
reportViewer.LocalReport.SetParameters(param)
' Render the report to PDF
Dim mimeType As String, encoding As String, fileNameExtension As String
Dim streams As String()
Dim warnings As Warning()
Dim bytes As Byte() = reportViewer.LocalReport.Render( _
"PDF", _
Nothing, _
mimeType, _
encoding, _
fileNameExtension, _
streams, _
warnings)
File.WriteAllBytes("output.pdf", bytes)
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
// Create a ChromePdfRenderer instance
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
var htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Save the PDF file
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
// Create a ChromePdfRenderer instance
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
var htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// Save the PDF file
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class IronPdfHtmlToPdf
Shared Sub Main()
' Create a ChromePdfRenderer instance
Dim renderer = New ChromePdfRenderer()
' Convert HTML string to PDF
Dim htmlContent = "<h1>Hello World</h1><p>This is HTML content.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Save the PDF file
pdf.SaveAs("output.pdf")
End Sub
End Class
Este exemplo demonstra a diferença arquitetônica fundamental. OSSRSexige a criação de uma instância ReportViewer, carregando um arquivo de definição de relatório .rdlc, definindo parâmetros, e então chamando LocalReport.Render("PDF") com múltiplos parâmetros out para metadados.
O IronPDF usa um ChromePdfRenderer com RenderHtmlAsPdf() em apenas três linhas de código. Não são necessários arquivos de definição de relatório, objetos de parâmetros ou manipulação de metadados. Consulte a documentação de conversão de HTML para PDF para obter exemplos completos.
Exemplo 2: URL para PDF com cabeçalhos e rodapés
Antes (SSRS):
//SSRS- SQL Server Reporting Services
using System;
using System.IO;
using System.Net;
using Microsoft.Reporting.WebForms;
class SSRSUrlToPdf
{
static void Main()
{
// Download HTML content from URL
string url = "https://example.com";
string htmlContent;
using (var client = new WebClient())
{
htmlContent = client.DownloadString(url);
}
// Create RDLC report with header/footer configuration
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "WebReport.rdlc";
// Set parameters for header and footer
var parameters = new ReportParameter[]
{
new ReportParameter("HeaderText", "Company Report"),
new ReportParameter("FooterText", "Page " + DateTime.Now.ToString()),
new ReportParameter("HtmlContent", htmlContent)
};
reportViewer.LocalReport.SetParameters(parameters);
// Render to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF", null, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
File.WriteAllBytes("webpage.pdf", bytes);
}
}
//SSRS- SQL Server Reporting Services
using System;
using System.IO;
using System.Net;
using Microsoft.Reporting.WebForms;
class SSRSUrlToPdf
{
static void Main()
{
// Download HTML content from URL
string url = "https://example.com";
string htmlContent;
using (var client = new WebClient())
{
htmlContent = client.DownloadString(url);
}
// Create RDLC report with header/footer configuration
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "WebReport.rdlc";
// Set parameters for header and footer
var parameters = new ReportParameter[]
{
new ReportParameter("HeaderText", "Company Report"),
new ReportParameter("FooterText", "Page " + DateTime.Now.ToString()),
new ReportParameter("HtmlContent", htmlContent)
};
reportViewer.LocalReport.SetParameters(parameters);
// Render to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF", null, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
File.WriteAllBytes("webpage.pdf", bytes);
}
}
Imports System
Imports System.IO
Imports System.Net
Imports Microsoft.Reporting.WebForms
Class SSRSUrlToPdf
Shared Sub Main()
' Download HTML content from URL
Dim url As String = "https://example.com"
Dim htmlContent As String
Using client As New WebClient()
htmlContent = client.DownloadString(url)
End Using
' Create RDLC report with header/footer configuration
Dim reportViewer As New ReportViewer()
reportViewer.ProcessingMode = ProcessingMode.Local
reportViewer.LocalReport.ReportPath = "WebReport.rdlc"
' Set parameters for header and footer
Dim parameters As ReportParameter() = {
New ReportParameter("HeaderText", "Company Report"),
New ReportParameter("FooterText", "Page " & DateTime.Now.ToString()),
New ReportParameter("HtmlContent", htmlContent)
}
reportViewer.LocalReport.SetParameters(parameters)
' Render to PDF
Dim mimeType As String, encoding As String, fileNameExtension As String
Dim streams As String()
Dim warnings As Warning()
Dim bytes As Byte() = reportViewer.LocalReport.Render(
"PDF", Nothing, mimeType, encoding,
fileNameExtension, streams, warnings)
File.WriteAllBytes("webpage.pdf", bytes)
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class IronPdfUrlToPdf
{
static void Main()
{
// Create a ChromePdfRenderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options with header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Company Report</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages} - " + DateTime.Now.ToString("MM/dd/yyyy") + "</div>"
};
// Convert URL to PDF
string url = "https://example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save the PDF file
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class IronPdfUrlToPdf
{
static void Main()
{
// Create a ChromePdfRenderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options with header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Company Report</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages} - " + DateTime.Now.ToString("MM/dd/yyyy") + "</div>"
};
// Convert URL to PDF
string url = "https://example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save the PDF file
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Class IronPdfUrlToPdf
Shared Sub Main()
' Create a ChromePdfRenderer instance
Dim renderer As New ChromePdfRenderer()
' Configure rendering options with header and footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Company Report</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages} - " & DateTime.Now.ToString("MM/dd/yyyy") & "</div>"
}
' Convert URL to PDF
Dim url As String = "https://example.com"
Dim pdf = renderer.RenderUrlAsPdf(url)
' Save the PDF file
pdf.SaveAs("webpage.pdf")
End Sub
End Class
OSSRSnão consegue converter URLs diretamente para PDF. Você deve baixar manualmente o conteúdo HTML com WebClient.DownloadString(), criar um arquivo de relatório .rdlc separado, passar o texto HTML e de cabeçalho/rodapé como arrays ReportParameter, e então renderizar com a assinatura de método complexa Render().
O RenderUrlAsPdf() do IronPDF lida com todo o processo em uma única chamada. Cabeçalhos e rodapés são configurados com objetos HtmlHeaderFooter que suportam HTML/CSS completo e espaços reservados como {page} e {total-pages}. Saiba mais em nossos tutoriais .
Exemplo 3: Relatório baseado em banco de dados
Antes (SSRS):
//SSRS- SQL Server Reporting Services
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;
using System.IO;
class SSRSDatabaseReport
{
static void Main()
{
// Create a ReportViewer instance
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "SalesReport.rdlc";
// Create database connection and fetch data
string connString = "Server=localhost;Database=SalesDB;Integrated Security=true;";
using (var connection = new SqlConnection(connString))
{
var adapter = new SqlDataAdapter("SELECT * FROM Sales", connection);
var dataSet = new DataSet();
adapter.Fill(dataSet, "Sales");
// Bind data to report
var dataSource = new ReportDataSource("SalesDataSet", dataSet.Tables[0]);
reportViewer.LocalReport.DataSources.Clear();
reportViewer.LocalReport.DataSources.Add(dataSource);
}
// Render to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF", null, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
File.WriteAllBytes("sales-report.pdf", bytes);
}
}
//SSRS- SQL Server Reporting Services
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Reporting.WebForms;
using System.IO;
class SSRSDatabaseReport
{
static void Main()
{
// Create a ReportViewer instance
var reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "SalesReport.rdlc";
// Create database connection and fetch data
string connString = "Server=localhost;Database=SalesDB;Integrated Security=true;";
using (var connection = new SqlConnection(connString))
{
var adapter = new SqlDataAdapter("SELECT * FROM Sales", connection);
var dataSet = new DataSet();
adapter.Fill(dataSet, "Sales");
// Bind data to report
var dataSource = new ReportDataSource("SalesDataSet", dataSet.Tables[0]);
reportViewer.LocalReport.DataSources.Clear();
reportViewer.LocalReport.DataSources.Add(dataSource);
}
// Render to PDF
string mimeType, encoding, fileNameExtension;
string[] streams;
Warning[] warnings;
byte[] bytes = reportViewer.LocalReport.Render(
"PDF", null, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
File.WriteAllBytes("sales-report.pdf", bytes);
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Reporting.WebForms
Imports System.IO
Class SSRSDatabaseReport
Shared Sub Main()
' Create a ReportViewer instance
Dim reportViewer As New ReportViewer()
reportViewer.ProcessingMode = ProcessingMode.Local
reportViewer.LocalReport.ReportPath = "SalesReport.rdlc"
' Create database connection and fetch data
Dim connString As String = "Server=localhost;Database=SalesDB;Integrated Security=true;"
Using connection As New SqlConnection(connString)
Dim adapter As New SqlDataAdapter("SELECT * FROM Sales", connection)
Dim dataSet As New DataSet()
adapter.Fill(dataSet, "Sales")
' Bind data to report
Dim dataSource As New ReportDataSource("SalesDataSet", dataSet.Tables(0))
reportViewer.LocalReport.DataSources.Clear()
reportViewer.LocalReport.DataSources.Add(dataSource)
End Using
' Render to PDF
Dim mimeType As String
Dim encoding As String
Dim fileNameExtension As String
Dim streams As String()
Dim warnings As Warning()
Dim bytes As Byte() = reportViewer.LocalReport.Render("PDF", Nothing, mimeType, encoding, fileNameExtension, streams, warnings)
File.WriteAllBytes("sales-report.pdf", bytes)
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
class IronPdfDatabaseReport
{
static void Main()
{
// Create database connection and fetch data
string connString = "Server=localhost;Database=SalesDB;Integrated Security=true;";
var dataTable = new DataTable();
using (var connection = new SqlConnection(connString))
{
var adapter = new SqlDataAdapter("SELECT * FROM Sales", connection);
adapter.Fill(dataTable);
}
// Build HTML table from data
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<h1>Sales Report</h1><table border='1'><tr>");
foreach (DataColumn column in dataTable.Columns)
htmlBuilder.Append($"<th>{column.ColumnName}</th>");
htmlBuilder.Append("</tr>");
foreach (DataRow row in dataTable.Rows)
{
htmlBuilder.Append("<tr>");
foreach (var item in row.ItemArray)
htmlBuilder.Append($"<td>{item}</td>");
htmlBuilder.Append("</tr>");
}
htmlBuilder.Append("</table>");
// Convert to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlBuilder.ToString());
pdf.SaveAs("sales-report.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
class IronPdfDatabaseReport
{
static void Main()
{
// Create database connection and fetch data
string connString = "Server=localhost;Database=SalesDB;Integrated Security=true;";
var dataTable = new DataTable();
using (var connection = new SqlConnection(connString))
{
var adapter = new SqlDataAdapter("SELECT * FROM Sales", connection);
adapter.Fill(dataTable);
}
// Build HTML table from data
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<h1>Sales Report</h1><table border='1'><tr>");
foreach (DataColumn column in dataTable.Columns)
htmlBuilder.Append($"<th>{column.ColumnName}</th>");
htmlBuilder.Append("</tr>");
foreach (DataRow row in dataTable.Rows)
{
htmlBuilder.Append("<tr>");
foreach (var item in row.ItemArray)
htmlBuilder.Append($"<td>{item}</td>");
htmlBuilder.Append("</tr>");
}
htmlBuilder.Append("</table>");
// Convert to PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlBuilder.ToString());
pdf.SaveAs("sales-report.pdf");
}
}
Imports IronPdf
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
Class IronPdfDatabaseReport
Shared Sub Main()
' Create database connection and fetch data
Dim connString As String = "Server=localhost;Database=SalesDB;Integrated Security=true;"
Dim dataTable As New DataTable()
Using connection As New SqlConnection(connString)
Dim adapter As New SqlDataAdapter("SELECT * FROM Sales", connection)
adapter.Fill(dataTable)
End Using
' Build HTML table from data
Dim htmlBuilder As New StringBuilder()
htmlBuilder.Append("<h1>Sales Report</h1><table border='1'><tr>")
For Each column As DataColumn In dataTable.Columns
htmlBuilder.Append($"<th>{column.ColumnName}</th>")
Next
htmlBuilder.Append("</tr>")
For Each row As DataRow In dataTable.Rows
htmlBuilder.Append("<tr>")
For Each item In row.ItemArray
htmlBuilder.Append($"<td>{item}</td>")
Next
htmlBuilder.Append("</tr>")
Next
htmlBuilder.Append("</table>")
' Convert to PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlBuilder.ToString())
pdf.SaveAs("sales-report.pdf")
End Sub
End Class
OSSRSexige um arquivo de relatório pré-desenhado .rdlc ("SalesReport.rdlc"), preenchendo um DataSet, criando um ReportDataSource com um nome específico ("SalesDataSet") que deve corresponder à definição do relatório, limpando fontes de dados existentes, adicionando a nova fonte de dados, e então renderizando.
O IronPDF usa seu código de acesso a dados existente (mesmo padrão SqlDataAdapter), e constrói HTML dinamicamente com StringBuilder. Você tem controle total sobre o layout usando HTML/CSS padrão — não são necessários arquivos de definição de relatório proprietários.
Comparação de recursos
| Recurso | SSRS | IronPDF | |||
|---|---|---|---|---|---|
| Infraestrutura : | Servidor necessário | Sim (Servidor de Relatórios) | Não | ||
| Licença do SQL Server | Obrigatório | Não é necessário | |||
| Servidor Windows | Obrigatório | Qualquer plataforma | |||
| Banco de dados necessário | Sim (Banco de Dados do Servidor de Relatórios) | Não | |||
| : Desenvolvimento : | Designer visual | Sim (.rdlc) | Editores HTML | ||
| Formato do modelo | RDLC/RDL | HTML/CSS/Razor | |||
| Fontes de dados | DSN integrado | Quaisquer dados em C# | |||
| Renderização : | HTML para PDF | Não | Cromo completo | ||
| URL para PDF | Não | Sim | |||
| Suporte a CSS | Limitado | CSS3 completo | |||
| JavaScript | Não | ES2024 completo | |||
| Gráficos | Embutido | Por meio de bibliotecas JS | |||
| : Implantação : | Implantação de relatórios | Para o servidor | Com aplicativo | ||
| Configuração | Complexo | Simples | |||
| Manutenção | Alto | Baixo |
Problemas comuns de migração
Edição 1: Definições do Relatório RDLC
SSRS: Utiliza o formato XML proprietário .rdlc.
Solução: Converter para modelos HTML:
- Abra o arquivo .rdlc no Visual Studio.
- Documente a estrutura do layout.
- Recriar em HTML/CSS
- Use o Razor para vinculação de dados.
Questão 2: Fontes de dados compartilhadas
SSRS: Cadeias de conexão no Servidor de Relatórios.
Solução: Utilize a camada de acesso a dados da sua aplicação:
var data = await _dbContext.Sales.ToListAsync();
// Then bind to HTML template
var data = await _dbContext.Sales.ToListAsync();
// Then bind to HTML template
Dim data = Await _dbContext.Sales.ToListAsync()
' Then bind to HTML template
Problema 3: Interface do usuário de parâmetros de relatório
SSRS: Solicitações de parâmetros integradas.
Solução: Crie uma interface de usuário para parâmetros em sua aplicação:
// Your own parameter form, then:
var pdf = GenerateReport(startDate, endDate, region);
// Your own parameter form, then:
var pdf = GenerateReport(startDate, endDate, region);
' Your own parameter form, then:
Dim pdf = GenerateReport(startDate, endDate, region)
Edição 4: Assinaturas/Relatórios Agendados
SSRS: Mecanismo de assinatura integrado.
Solução: Utilize a estrutura de tarefas em segundo plano:
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);
Lista de verificação para migração
Pré-migração
- Inventarie todos os relatóriosSSRS(arquivos
.rdlc) - Documentar as fontes de dados e conexões
- Capturas de tela dos layouts dos relatórios para referência visual.
- Listar os parâmetros de cada relatório
- Observe os cronogramas de assinatura.
- Obtenha a chave de licença do IronPDF em IronPDF
Atualizações de código
- Remover pacotes ReportViewer
- Instale o pacote NuGet
IronPdf - Converta os arquivos
.rdlcem modelos HTML - Substitua
LocalReportporChromePdfRenderer - Substitua
ReportDataSourcepor dados C# + modelos HTML - Substitua
ReportParameterpor interpolação de strings - Substitua
LocalReport.Render("PDF")porRenderHtmlAsPdf() - Implemente cabeçalhos/rodapés com
HtmlHeaderFooter - Adicionar inicialização de licença na inicialização do aplicativo
Infraestrutura
- Desativação do servidor de relatórios de planos
- Migrar assinaturas para o agendador de tarefas (Hangfire, etc.)
- Atualizar scripts de implantação
Testando
- Comparar visualmente a saída em PDF
- Verificar a precisão dos dados
- Paginação de teste
- Verifique todos os parâmetros
- Testes de desempenho

