SSRS에서 IronPDF로의 마이그레이션 방법 (C#)
SQL Server Reporting Services (SSRS)에서 IronPDF로의 마이그레이션은 PDF 생성 워크플로를 대규모 서버 기반 인프라에서 모든 .NET 애플리케이션에 직접 임베드될 수 있는 경량의 프로세스 내 라이브러리로 변환합니다. 이 가이드는 SQL Server 종속성, 보고 서버 오버헤드 및 Microsoft 생태계 락인을 제거하는 완전하고 단계적인 마이그레이션 경로를 제공합니다.
SSRS에서 IronPDF로 마이그레이션해야 하는 이유
SSRS이해하기
SQL Server Reporting Services (SSRS)는 Microsoft의 Enterprise 보고 플랫폼이며, SQL Server 생태계와 긴밀히 통합된 보고서 생성, 배포 및 관리를 위한 완벽한 제품군입니다. Microsoft는 SSRS 2022가 최종 독립 버전임을 확인했습니다: SQL Server 2025부터는 서버 내부 보고서가 Power BI 보고서 서버(PBIRS)로 통합되며, 새로운SSRS릴리스가 출시되지 않습니다.SSRS2022는 2033년 1월 11일까지 보안 업데이트를 받습니다. 이는 SQL Server 2022 라이프사이클과 일치합니다 (자세한 내용은 보고 서비스 통합 FAQ 참조).
여러 PDF 생성 시나리오에서SSRS인프라는 과도합니다. 이주를 위한 주요한 이유는 다음과 같습니다:
- SSRS 라인의 종료: SQL Server 2025는SSRS없이 출시됩니다; PBIRS가 이를 대체합니다. SSRS를 목표로 하는 새로운 작업은 막다른 길입니다.
- 무거운 인프라: SQL Server, 리포트 서버 및 (구형 웹 폼 뷰어의 경우) IIS 구성이 필요
- Microsoft 생태계 고립: SQL Server 라이센싱 및 Windows Server에 종속
- 복잡한 배포: 리포트 배포, 보안 구성 및 구독 관리
- 비싼 라이센싱: 특히 Enterprise 기능의 경우 SQL Server 라이센스
- 정식 .NET Core 지원 부재: Microsoft의
Microsoft.ReportingServices.ReportViewerControl.WebForms/.Winforms패키지는 .NET Framework 4.0–4.8.1만을 대상으로 합니다. .NET Core / .NET 5+ 사용자는 커뮤니티 포트ReportViewerCore.NETCore에 의존합니다. - 유지보수 오버헤드: 서버 패칭, 데이터베이스 유지보수, 보고서 관리
- 클라우드 네이티브 옵션 없음: 온프레미스를 위해 설계되었으며, 클라우드 지원이 어색함
SSRS가 과도할 때
| 필요 | SSRS오버헤드 |
|---|---|
| 송장 생성 | 전체 보고서 서버 |
| 데이터 테이블 내보내기 | SQL Server 라이선스 |
| 데이터로부터 PDF 생성 | Windows Server |
| 간단한 문서 생성 | 보고서 구독 |
IronPDF는 서버 인프라 없이 프로세스 내 PDF 생성을 제공합니다.
SSRS대IronPDF비교
| 기능 | SSRS | IronPDF |
|---|---|---|
| 의존성 | SQL Server가 필요함 | 특정 데이터베이스 종속성 없음 |
| 배포 | 서버 기반 | 라이브러리 (애플리케이션에 내장됨) |
| 통합 | Microsoft와의 긴밀한 통합 | 모든 데이터 소스와 작동 |
| 데이터 시각화 | 광범위한 네이티브 옵션 | PDF 중심의 시각화 |
| 복잡성 | 높음 (서버 설정 필요) | 보통에서 낮음 (라이브러리 설정) |
| 비용 | SQL Server 라이선스 비용 | 개발자당 라이선스 비용 |
| HTML to PDF | 아니요 | 전체 Chromium |
| URL을 PDF로 | 아니요 | 예 |
| CSS 지원 | 제한적 | 전체 CSS3 |
| JavaScript | 아니요 | 전체 ES2024 |
IronPDF는 SSRS와 달리 특정 데이터베이스 또는 서버 생태계에 종속되지 않습니다. 개발자가 C#에서 PDF 문서를 동적으로 생성, 편집 및 조작할 수 있는 유연한 라이브러리를 제공합니다. 이 서버 기반 인프라에서의 분리는 명확한 장점을 제공하며, 보고서 외의 다양한 애플리케이션에 적합한 단순성과 적응성을 갖추고 있습니다.
현대 .NET을 채택하는 팀에게 IronPDF는 SSRS의 인프라 복잡성을 없애주는 Chromium 렌더링 엔진을 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
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
라이선스 구성
// 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"
완전한 API 참조
네임스페이스 변경
// 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
핵심 API 매핑
| SSRS 개념 | IronPDF 동등 | 노트 |
|---|---|---|
LocalReport |
ChromePdfRenderer |
코어 렌더링 |
ServerReport |
RenderUrlAsPdf() |
URL 기반 렌더링 |
.rdlc 파일 |
HTML/CSS 템플릿 | 템플릿 형식 |
ReportParameter |
문자열 보간 | 매개변수 |
ReportDataSource |
C# 데이터 + HTML | 데이터 바인딩 |
LocalReport.Render("PDF") |
RenderHtmlAsPdf() |
PDF 출력 |
SubReport |
병합된 PDFs | 중첩 보고서 |
Report Server URL |
필요 없음 | 서버 필요 없음 |
ReportViewer 제어 |
필요 없음 | 직접 PDF 생성 |
| 내보내기 형식 | PDF가 네이티브 | 집중된 출력 |
코드 마이그레이션 예제
예제 1: HTML에서 PDF로 변환
이전 (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
이후 (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
이 예제는 근본적인 아키텍처 차이를 보여줍니다. SSRS는 ReportViewer 인스턴스 생성, .rdlc 보고서 정의 파일 로드, 매개변수 설정, 그런 다음 메타데이터를 위한 다중 out 매개변수와 함께 LocalReport.Render("PDF") 호출을 필요로 합니다.
IronPDF는 단 세 줄의 코드에서 ChromePdfRenderer 및 RenderHtmlAsPdf()을 사용합니다. 보고서 정의 파일, 매개변수 개체, 메타데이터 처리 필요 없음. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: 헤더 및 푸터를 포함한 URL을 PDF로 변환
이전 (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
이후 (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는 URL을 직접 PDF로 변환할 수 없습니다. HTML 콘텐츠를 WebClient.DownloadString()로 수동으로 다운로드하고, 별도의 .rdlc 보고서 파일을 생성하고, HTML과 헤더/푸터 텍스트를 ReportParameter 배열로 전달한 다음 복잡한 Render() 메서드 시그니처로 렌더링 해야 합니다.
IronPDF의 RenderUrlAsPdf()은 전체 과정을 한 번의 호출로 처리합니다. 헤더와 푸터는 HtmlHeaderFooter 객체로 구성되며, 전체 HTML/CSS와 {page} 및 {total-pages} 같은 플레이스홀더를 지원합니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 3: 데이터베이스 기반 보고서
이전 (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
이후 (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는 사전 설계된 .rdlc 보고서 파일('SalesReport.rdlc'), DataSet 채우기, 보고서 정의와 일치해야 하는 특정 이름('SalesDataSet')의 ReportDataSource 생성, 기존 데이터 소스 지우기, 새 데이터 소스 추가 후 렌더링이 필요합니다.
IronPDF는 기존 데이터 액세스 코드(같은 SqlDataAdapter 패턴)를 사용한 후 StringBuilder로 HTML을 동적으로 생성합니다. 표준 HTML/CSS를 사용하여 레이아웃을 완전히 제어할 수 있으며, 독점적인 보고서 정의 파일이 필요하지 않습니다.
기능 비교
| 기능 | SSRS | IronPDF | |||
|---|---|---|---|---|---|
| :인프라스트럭처: | 서버 필요 | 예 (리포트 서버) | 아니요 | ||
| SQL 서버 라이선스 | 필요함 | 필요 없음 | |||
| Windows Server | 필요함 | 모든 플랫폼 | |||
| 데이터베이스 필요 | 예 (ReportServer DB) | 아니요 | |||
| :개발: | 비주얼 디자이너 | 예 (.rdlc) | HTML 편집기 | ||
| 템플릿 포맷 | RDLC/RDL | HTML/CSS/Razor | |||
| 데이터 소스 | 내장 DSN | 모든 C# 데이터 | |||
| :렌더링: | HTML to PDF | 아니요 | 전체 Chromium | ||
| URL을 PDF로 변환 | 아니요 | 예 | |||
| CSS 지원 | 제한적 | 전체 CSS3 | |||
| JavaScript | 아니요 | 전체 ES2024 | |||
| 차트 | 내장형 | JS 라이브러리를 통해 | |||
| :배포: | 보고서 배포 | 서버로 | 앱과 함께 | ||
| 구성 | 복잡함 | 간단함 | |||
| 유지보수 | 높음 | 낮음 |
일반적인 마이그레이션 문제
문제 1: RDLC 보고서 정의
SSRS: 독점 .rdlc XML 형식 사용.
해결 방법: HTML 템플릿으로 변환:
- Visual Studio에서 .rdlc 열기
- 레이아웃 구조 문서화
- HTML/CSS로 다시 생성
- 데이터 바인딩에 Razor 사용
문제 2: 공유 데이터 소스
SSRS: 리포트 서버의 연결 문자열.
해결 방법: 애플리케이션의 데이터 액세스 레이어 사용:
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
문제 3: 보고서 매개변수 UI
SSRS: 기본 매개변수 프롬프트.
해결 방법: 애플리케이션 내 매개변수 UI 구축:
// 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)
문제 4: 구독/예약 보고서
SSRS: 기본 구독 엔진.
해결 방법: 백그라운드 작업 프레임워크 사용:
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);
// Using Hangfire or similar
RecurringJob.AddOrUpdate("weekly-report",
() => GenerateAndEmailReport(), Cron.Weekly);
마이그레이션 체크리스트
사전 마이그레이션
- 모든SSRS보고서(
.rdlc파일) 목록 작성 - 데이터 소스 및 연결 문서화
- 보고서 레이아웃의 시각적 참조를 위한 스크린샷
- 각 보고서의 보고서 매개변수 목록
- 구독 일정 메모
- ironpdf.com에서IronPDF라이선스 키 획득
코드 업데이트
- ReportViewer 패키지 제거
IronPdfNuGet Install-Package.rdlc파일을 HTML 템플릿으로 변환LocalReport을ChromePdfRenderer로 대체ReportDataSource을 C# 데이터 + HTML 템플릿으로 대체ReportParameter을 문자열 보간법으로 대체LocalReport.Render("PDF")을RenderHtmlAsPdf()로 대체HtmlHeaderFooter으로 헤더/푸터 구현- 애플리케이션 시작 시 라이선스 초기화 추가
인프라
- 리포트 서버 퇴출 계획
- 작업 스케줄러(Hangfire 등)로 구독 이동
- 배포 스크립트 업데이트
테스트
- PDF 출력 시각적으로 비교
- 데이터 정확성 확인
- 페이지 매김 테스트
- 모든 매개변수 확인
- 성능 테스트

