SSRS에서 IronPDF로의 마이그레이션 방법 (C#)
SQL Server Reporting Services (SSRS)에서 IronPDF로의 마이그레이션은 PDF 생성 워크플로를 대규모 서버 기반 인프라에서 모든 .NET 애플리케이션에 직접 임베드될 수 있는 경량의 프로세스 내 라이브러리로 변환합니다. 이 가이드는 SQL Server 종속성, 보고 서버 오버헤드 및 Microsoft 생태계 락인을 제거하는 완전하고 단계적인 마이그레이션 경로를 제공합니다.
SSRS에서 IronPDF로 마이그레이션해야 하는 이유
SSRS이해하기
SQL Server Reporting Services (SSRS)는 Microsoft의 Enterprise 보고 플랫폼으로 상당한 인프라 투자가 필요합니다. SSRS는 Microsoft의 포괄적인 보고 플랫폼으로, 보고서 작성, 배포, 관리하는 전체 Suite를 제공하며 풍부한 기능의 보고서와 대화형 보고서 기능을 제공합니다. SQL Server 생태계의 일부로 개발된 SSRS는 Microsoft의 데이터베이스 솔루션과 밀접하게 통합되어 있습니다.
그러나 많은 PDF 생성 시나리오에서는SSRS인프라가 과도합니다. 마이그레이션해야 하는 주요 이유는 다음과 같습니다:
- 대규모 인프라: SQL Server, Report Server 및 IIS 설정 필요
- Microsoft 생태계 락인: SQL Server 라이선스 및 Windows Server에 종속
- 복잡한 배포: 보고서 배포, 보안 설정 및 구독 관리
- 비용이 많이 드는 라이선스: 특히 Enterprise 기능을 위한 SQL Server 라이선스
- 제한된 웹 지원: 최신 SPA 프레임워크와 통합하기 어려움
- 유지보수 오버헤드: 서버 패칭, 데이터베이스 유지보수, 보고서 관리
- 클라우드 네이티브 옵션 없음: 온프레미스용으로 설계되어 클라우드 지원이 어색함
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 문서를 동적으로 생성, 편집 및 조작할 수 있는 유연한 라이브러리를 제공합니다. 이 서버 기반 인프라에서의 분리는 명확한 장점을 제공하며, 보고서 외의 다양한 애플리케이션에 적합한 단순성과 적응성을 갖추고 있습니다.
팀이 2025년과 2026년에 .NET 10과 C# 14를 도입하려는 계획이라면, 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 패키지 변경 사항
#SSRShas 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
#SSRShas 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
라이선스 구성
// 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로 변환할 수 없습니다. WebClient.DownloadString()과 함께 HTML 콘텐츠를 수동으로 다운로드하고, 별도의 .rdlc 보고서 파일을 생성하고, HTML과 헤더/푸터 텍스트를 ReportParameter 배열로 전달한 후, 복잡한 Render() 메서드 시그니처를 사용하여 렌더링해야 합니다.
IronPDF의 RenderUrlAsPdf()는 단일 호출로 전체 프로세스를 처리합니다. 헤더와 푸터는 풀 HTML/CSS와 {page} 및 {total-pages} 같은 플레이스홀더를 지원하는 HtmlHeaderFooter 객체로 구성됩니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 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 출력 시각적으로 비교
- 데이터 정확성 확인
- 페이지 매김 테스트
- 모든 매개변수 확인
- 성능 테스트

