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 do SSRS para o IronPDF?
Entendendo o SSRS
O SQL Server Reporting Services (SSRS) é a plataforma de relatórios corporativos da Microsoft que requer um investimento significativo em infraestrutura. O SSRS é uma plataforma de relatórios abrangente da Microsoft que fornece um conjunto completo para criar, implantar e gerenciar relatórios, oferecendo recursos avançados e interativos. Desenvolvido como parte do ecossistema do SQL Server, o SSRS está intimamente integrado às soluções de banco de dados da Microsoft.
No entanto, para muitos cenários de geração de PDFs, a infraestrutura do SSRS é excessiva. Os principais motivos para migrar incluem:
- Infraestrutura complexa: Requer configuração do SQL Server, do Report Server e do IIS.
- Dependência do ecossistema Microsoft: Vinculada ao licenciamento do SQL Server e do 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 corporativos.
- Suporte Web limitado: Dificuldade de integração com frameworks SPA modernos.
- Custos de manutenção: aplicação de patches no servidor, manutenção do banco de dados, gerenciamento de relatórios.
- Sem opção nativa da nuvem: Projetado para ambientes locais, o suporte à nuvem é complicado.
Quando o SSRS é exagerado
| Sua necessidade | Visão geral do SSRS |
|---|---|
| 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 entre SSRS e 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 que planejam a adoção do .NET 10 e do C# 14 até 2025 e 2026, o IronPDF oferece um mecanismo de renderização Chromium moderno 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
# SSRS has no direct NuGet - it's server-based
# Remove any ReportViewer controls
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WebForms
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WinForms
# Install IronPDF
dotnet add package IronPdf
# SSRS has no direct NuGet - it's server-based
# Remove any ReportViewer controls
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WebForms
dotnet remove package Microsoft.ReportingServices.ReportViewerControl.WinForms
# 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
| Conceito SSRS | Equivalente ao IronPDF | Notas |
|---|---|---|
LocalReport |
ChromePdfRenderer |
Renderização principal |
ServerReport |
RenderUrlAsPdf() |
renderização baseada em URL |
.rdlc arquivos |
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 |
ReportViewer controle |
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
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("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. O SSRS requer a criação de uma instância ReportViewer, o carregamento de um arquivo de definição de relatório .rdlc, a configuração de parâmetros e, em seguida, a chamada de LocalReport.Render("PDF") com vários parâmetros out para metadados.
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
O SSRS não consegue converter URLs diretamente para PDF. Você deve baixar manualmente o conteúdo HTML com WebClient.DownloadString(), criar um arquivo de relatório separado .rdlc, passar o HTML e o texto do cabeçalho/rodapé como arrays ReportParameter e, em seguida, renderizar com a assinatura de método complexa Render().
O RenderUrlAsPdf() do IronPDF lida com todo o processo em uma única chamada. Os 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, 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("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
O SSRS requer um arquivo de relatório pré-projetado ("SalesReport.rdlc"), preenchimento de um DataSet, criação de um ReportDataSource com um nome específico ("SalesDataSet") que deve corresponder à definição do relatório, limpeza das fontes de dados existentes, adição da nova fonte de dados e, em seguida, renderização.
O IronPDF usa seu código de acesso a dados existente (mesmo padrão SqlDataAdapter), e então constrói o 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
- Inventariar todos os relatórios SSRS (
.rdlcarquivos) - 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 - Converter arquivos
.rdlcem modelos HTML - Substitua
LocalReportporChromePdfRenderer - Substitua
ReportDataSourcepor dados C# + modelos HTML - Substitua
ReportParameterpor interpolação de string - Substitua
LocalReport.Render("PDF")porRenderHtmlAsPdf() - Implementar 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

