Jak przeprowadzić migrację z SSRS do IronPDF w języku C#
Migracja z SQL Server Reporting Services (SSRS) na IronPDF przekształca twój przepływ pracy generacji PDF z ciężkiej, serwerowej infrastruktury na lekką, biblioteczkę wewnątrz aplikacji, która może być osadzona bezpośrednio w dowolnej aplikacji .NET. Ten przewodnik dostarcza pełną, szczegółową ścieżkę migracji, która eliminuje zależności SQL Server, obciążenie serwera raportów i zamknięcie w ekosystemie Microsoft.
Dlaczego migrować z SSRS do IronPDF
Zrozumienie SSRS
SQL Server Reporting Services (SSRS) to platforma raportowa firmy Microsoft dla przedsiębiorstw — pełen zestaw do tworzenia, wdrażania i zarządzania raportami, ściśle zintegrowany z ekosystemem SQL Server. Microsoft potwierdził, że SSRS 2022 to ostatnia niezależna wersja: począwszy od SQL Server 2025, raportowanie lokalne zostanie skoncentrowane w Power BI Report Server (PBIRS), a nowe wersje SSRS nie będą publikowane. SSRS 2022 otrzymuje aktualizacje zabezpieczeń do 11 stycznia 2033, zgodnie z cyklem życia SQL Server 2022 (zobacz FAQ o konsolidacji usług raportowania).
Dla wielu scenariuszy generowania PDF, infrastruktura SSRS jest nadmiarem. Kluczowe powody do migracji obejmują:
- Koniec z SSRS: SQL Server 2025 jest dostarczany bez SSRS; PBIRS go zastępuje. Nowe prace skierowane na SSRS to ślepa uliczka.
- Ciężka infrastruktura: Wymaga SQL Server, Report Server i (dla starszego widoku Web Forms) konfiguracji IIS
- Uwiązanie przez ekosystem Microsoft: Powiązane z licencjonowaniem SQL Server i Windows Server
- Złożona implementacja: Wdrożenie raportów, konfiguracja zabezpieczeń i zarządzanie subskrypcjami
- Drogie licencjonowanie: Licencje SQL Server, zwłaszcza dla funkcji przedsiębiorstwa
- Brak wsparcia pierwszej klasy dla .NET Core: pakiety Microsoft
Microsoft.ReportingServices.ReportViewerControl.WebForms/.Winformssą przeznaczone tylko dla .NET Framework 4.0–4.8.1. Użytkownicy .NET Core / .NET 5+ polegają na porcie społecznościowymReportViewerCore.NETCore. - Dodatkowe obciążenie konserwacyjne: Łatanie serwera, konserwacja baz danych, zarządzanie raportami
- Brak opcji zintegrowanej z chmurą: Zaprojektowane dla środowisk lokalnych, wsparcie w chmurze jest niezręczne
Kiedy SSRS to przesada
| Twoje potrzeby | SSRS narzut |
|---|---|
| Generowanie faktur | Pełny serwer raportów |
| Eksport tabel danych | Licencja SQL Server |
| Tworzenie plików PDF na podstawie danych | Windows Server |
| Proste generowanie dokumentów | Subskrypcje raportów |
IronPDF umożliwia generowanie plików PDF w trakcie przetwarzania bez konieczności posiadania infrastruktury serwerowej.
Porównanie SSRS z IronPDF
| Funkcja | SSRS | IronPDF |
|---|---|---|
| Zależności | Wymaga SQL Server | Brak konkretnej zależności od bazy danych |
| Wdrożenie | Oparte na serwerze | Biblioteka (wbudowana w aplikacje) |
| Integracja | Ścisła integracja z Microsoftem | Działa z dowolnym źródłem danych |
| Wizualizacja danych | Szeroki wybór opcji językowych | Wizualizacje skupione na plikach PDF |
| Złożoność | Wysoki (wymagana konfiguracja serwera) | Umiarkowana do niskiej (konfiguracja biblioteki) |
| Koszt | Koszty licencji SQL Server | Koszt licencji dla programisty |
| HTML do PDF | Nie | Pełny Chromium |
| URL do pliku PDF | Nie | Tak |
| Obsługa CSS | Ograniczone | Pełny CSS3 |
| JavaScript | Nie | Pełna wersja ES2024 |
IronPDF, w odróżnieniu od SSRS, nie jest związany z żadnym specyficznym ekosystemem baz danych ani serwerów. Zapewnia deweloperom elastyczną bibliotekę do dynamicznego tworzenia, edytowania i manipulowania dokumentami PDF bezpośrednio w C#. To rozdzielenie od infrastruktury opartej na serwerze oferuje zauważalną korzyść — jest proste i elastyczne, nadające się do szerokiej gamy aplikacji, nie tylko do raportowania.
Dla zespołów przyjmujących nowoczesny .NET, IronPDF dostarcza silnik renderujący Chromium, który eliminuje złożoność infrastruktury SSRS.
Zanim zaczniesz
Wymagania wstępne
- Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
- Dostęp do NuGet: Możliwość instalowania pakietów NuGet
- Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com
Zmiany w pakiecie NuGet
# SSRS itself 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
# SSRS itself 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
Konfiguracja licencji
// 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"
Kompletna dokumentacja API
Zmiany w przestrzeni nazw
// 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
Mapowania podstawowych interfejsów API
| Koncepcja SSRS | Odpowiednik IronPDF | Uwagi |
|---|---|---|
LocalReport |
ChromePdfRenderer |
Renderowanie rdzenia |
ServerReport |
RenderUrlAsPdf() |
Renderowanie oparte na URL |
.rdlc pliki |
Szablony HTML/CSS | Format szablonu |
ReportParameter |
Interpolacja ciągów znaków | Parametry |
ReportDataSource |
Dane C# + HTML | Powiązanie danych |
LocalReport.Render("PDF") |
RenderHtmlAsPdf() |
Wynik w formacie PDF |
SubReport |
Połączone pliki PDF | Raporty zagnieżdżone |
Report Server URL |
Nie jest potrzebne | Nie wymaga serwera |
ReportViewer kontrola |
Nie jest potrzebne | Bezpośrednia generacja PDF |
| Formaty eksportu | PDF jest formatem natywnym | Skoncentrowane output |
Przykłady migracji kodu
Przykład 1: Konwersja HTML do PDF
Before (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
Po (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
Ten przykład ilustruje podstawową różnicę architektoniczną. SSRS wymaga utworzenia instancji ReportViewer, załadowania pliku definicji raportu .rdlc, ustawienia parametrów, a następnie wywołania LocalReport.Render("PDF") z wieloma out parametrami metadanych.
IronPDF używa ChromePdfRenderer z RenderHtmlAsPdf() w zaledwie trzech liniach kodu. Nie są wymagane pliki definicji raportów, obiekty parametrów ani obsługa metadanych. Kompleksowe przykłady można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.
Przykład 2: URL do PDF z nagłówkami i stopkami
Before (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
Po (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
SSRS nie może bezpośrednio konwertować URL do PDF. Musisz ręcznie pobrać treść HTML za pomocą WebClient.DownloadString(), utworzyć oddzielny plik raportu .rdlc, przekazać treść HTML i tekst nagłówka/stopki jako tablice ReportParameter, a następnie wyrenderować złożonym podpisem metody Render().
RenderUrlAsPdf() w IronPDF obsługuje cały proces jednym wywołaniem. Nagłówki i stopki są konfigurowane z obiektami HtmlHeaderFooter, które obsługują pełny HTML/CSS i placeholdery jak {page} i {total-pages}. Dowiedz się więcej z naszych samouczków.
Przykład 3: Raport oparty na bazie danych
Before (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
Po (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
SSRS wymaga wstępnie zaprojektowanego pliku raportu .rdlc ("SalesReport.rdlc"), wypełnienia DataSet, stworzenia ReportDataSource z określoną nazwą ("SalesDataSet"), która musi zgadzać się z definicją raportu, usunięcia istniejących źródeł danych, dodania nowego źródła danych, a następnie renderowania.
IronPDF używa Twojego istniejącego kodu dostępu do danych (ten sam wzorzec SqlDataAdapter), a następnie dynamicznie buduje HTML za pomocą StringBuilder. Masz pełną kontrolę nad układem używając standardowego HTML/CSS — nie są wymagane pliki definicji raportów.
Porównanie funkcji
| Funkcja | SSRS | IronPDF | |||
|---|---|---|---|---|---|
| :Infrastructure: | Wymagany serwer | Tak (Serwer raportów) | Nie | ||
| Licencja SQL Server | Wymagane | Nie jest potrzebne | |||
| Windows Server | Wymagane | Dowolna platforma | |||
| Wymagana baza danych | Tak (baza danych ReportServer) | Nie | |||
| :Rozwój: | Projektant wizualny | Tak (.rdlc) | Edytory HTML | ||
| Format szablonu | RDLC/RDL | HTML/CSS/Razor | |||
| Źródła danych | Wbudowany DSN | Wszelkie dane w języku C# | |||
| :Rendering: | HTML do PDF | Nie | Pełny Chromium | ||
| URL do pliku PDF | Nie | Tak | |||
| Obsługa CSS | Ograniczone | Pełny CSS3 | |||
| JavaScript | Nie | Pełna wersja ES2024 | |||
| Wykresy | Wbudowane | Za pośrednictwem bibliotek JS | |||
| :Wdrozenie: | Wdrożenie raportu | Do serwera | Z aplikacją | ||
| Konfiguracja | Złożone | Proste | |||
| Konserwacja | Wysoka | Niski |
Typowe problemy związane z migracją
Problem 1: Definicje raportów RDLC
SSRS: Używa własnego formatu XML .rdlc.
Rozwiązanie: Konwersja na szablony HTML:
- Otwórz .rdlc w Visual Studio
- Opisz strukturę układu
- Odtwórz w HTML/CSS
- Użyj Razor do łączenia danych
Problem 2: Udostępnione źródła danych
SSRS: Łańcuchy połączeń w Report Server.
Rozwiązanie: Użyj warstwy dostępu do danych aplikacji:
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
Problem 3: UI parametrów raportu
SSRS: Wbudowane wywołania parametrów.
Rozwiązanie: Zbuduj UI parametrów w swojej aplikacji:
// 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)
Problem 4: Subskrypcje/zaplanowane raporty
SSRS: Wbudowany silnik subskrypcji.
Rozwiązanie: Użyj frameworka prac w tle:
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);
Lista kontrolna migracji
Przed migracją
- Inwentaryzacja wszystkich raportów SSRS (pliki
.rdlc) - Udokumentuj źródła danych i połączenia
- Zrób zrzut ekranowy układów raportów dla odniesienia wizualnego
- Wypisz parametry raportów dla każdego raportu
- Zapisz harmonogramy subskrypcji
- Uzyskaj klucz licencyjny IronPDF ze strony ironpdf.com
Aktualizacje kodu
- Usuń pakiety ReportViewer
- Instalacja pakietu NuGet
IronPdf - Konwersja plików
.rdlcna szablony HTML - Zastąp
LocalReportprzezChromePdfRenderer - Zastąp
ReportDataSourceprzez dane C# + szablony HTML - Zastąp
ReportParameterprzez interpolację łańcuchów - Zastąp
LocalReport.Render("PDF")przezRenderHtmlAsPdf() - Zastosuj nagłówki/stopki za pomocą
HtmlHeaderFooter - Dodaj inicjalizację licencji podczas uruchamiania aplikacji
Infrastruktura
- Zaplanuj wycofanie z użytkowania serwera raportów
- Zmiany subskrypcji na planista zadań (np. Hangfire)
- Aktualizacja skryptów wdrażania
Testowanie
- Porównaj wizualnie wynik PDF
- Zweryfikuj dokładność danych
- Przetestuj paginację
- Sprawdź wszystkie parametry
- Testy wydajności

