Christa Carpentiere
Microsoft Corporation
적용 대상
ADO.NET
SQL Server
Reporting Services
요약: ADO.NET DataSet를 데이터 원본으로 사용할 수 있도록 하는 Reporting Services의 데이터 처리 확장을 구축하는 방법에 대해 설명합니다 (21페이지/인쇄 페이지 기준).
이 기사의 Visual Basic 샘플 코드를 다운로드하려면 여기를 클릭하고 C# 코드를 다운로드하려면 여기를 클릭하십시오.
목차
소개
데이터 처리 확장 기본 사항
확장 구현
확장 배포
보고서 만들기
결론
관련 서적
소개
Reporting Services는 표준 기능의 일부로서 SQL Server, Oracle, ODBC 및 OLE DB 데이터 원본에 대한 액세스를 제공합니다. 대부분의 보고 시나리오의 경우, 보고할 모든 정보를 가져오려면 데이터베이스에 연결하고 쿼리를 실행하기만 하면 됩니다. 그러나 DataSet를 데이터 원본으로 사용하고자 할 경우에는 어떻게 될까요? 예를 들어, 비즈니스 논리를 따르고 DataSet를 결과로 생성하기 위해 데이터를 처리하는 중간 계층이 이미 있을 수 있습니다. 또는 중간 계층은 없지만 SQL 구현이 아닌 Microsoft Visual Basic 또는 C# 구현에 더 적합한 방법으로, 보고하기 전에 원시 데이터를 조작하려고 할 수 있으며, DataSet가 그러한 처리의 논리적인 최종 결과일 수도 있습니다. 다행히도, DataSet를 데이터 원본으로 사용할 수 있습니다. Reporting Services에서 사용할 수 있는 방식으로 DataSet를 랩하기 위해 구현해야 할 데이터 처리 확장 부분만 작업하고 나면, 비교적 간단하게 해결할 수 있습니다(이 기사에는 영문 페이지 링크가 포함되어 있습니다).
이 기사에서는 DataSet 데이터를 Reporting Services 보고서에 제공하는 데 사용할 수 있는 단순 데이터 처리 확장 부분을 작성 및 배포하는 방법에 대해 살펴보겠습니다.
데이터 처리 확장 기본 사항
Reporting Services를 사용하면 데이터 처리 확장을 사용하여 사용 가능한 데이터 원본을 확장하거나 사용자 지정할 수 있습니다. 데이터 처리 확장은 Microsoft.ReportingServices.DataProcessing 네임스페이스에서 사용할 수 있는 일련의 인터페이스 구현이 포함되어 있는 어셈블리입니다. 데이터 처리 확장에서 구현해야 하는 인터페이스는 7개입니다.
표 1. 데이터 처리 확장의 6개 인터페이스
인터페이스 | 설명 |
---|---|
IDbConnection | 데이터 원본을 사용하는 고유 세션을 나타냅니다. 클라이언트/서버 데이터베이스 시스템의 경우, 세션은 서버와의 네트워크 연결에 해당합니다. |
IDbTransaction | 로컬 트랜잭션을 나타냅니다. |
IDbCommand | 데이터 원본에 연결된 경우 사용되는 쿼리 또는 명령을 나타냅니다. |
IDataParameter | 명령이나 쿼리로 전달되는 매개 변수 또는 이름/값 쌍을 나타냅니다. |
IDataParameterCollection | 명령이나 쿼리에 관련된 모든 매개 변수의 컬렉션을 나타냅니다. |
IDataReader | 데이터 원본에서 전달 및 읽기 전용 데이터 스트림을 읽는 메서드를 제공합니다. |
또한 연결, 트랜잭션 등의 추가 기능을 제공하는 7개의 선택적 인터페이스도 있지만, 이러한 인터페이스가 제공하는 향상 기능은 DataSet 데이터 처리 확장에서 필요하지 않습니다. 이러한 추가 인터페이스에 대한 자세한 내용은 Reporting Services 설명서의 Preparing to Implement a Data Processing Extension 항목을 참조하십시오.
위에 나열된 인터페이스를 살펴보면, 데이터 처리 확장을 구축하는 작업이 Microsoft .NET Framework 데이터 공급자를 구축하는 작업과 비슷하다는 사실을 알 수 있습니다. 이러한 여러 인터페이스에는 동일한 이름이 지정되어 있으며 동일하지는 않지만 비슷한 기능을 제공하므로, 이전에 System.Data 인터페이스에서 작업한 경우 차이점에 주의해야 합니다.
DataSet에 액세스할 목적이라면, 필요한 인터페이스 중 절반은 최소 구현만 필요로 하며, 나머지 인터페이스는 기본적인 기능으로 구현할 수 있습니다. 이제 이 확장을 구현하는 방법에 대해 살펴보겠습니다.
확장 구현
이 기사에 나오는 샘플 응용 프로그램은 두 개 이상의 XML 파일에서 데이터를 읽은 다음 이러한 파일의 데이터를 하나의 DataSet에서 하나의 Table로 집계합니다. 파일 이름은 명령 텍스트로 지정됩니다. Connection 속성을 사용하여 보고서 서버 config 파일에서 파일 구조를 확인하는 스키마를 읽어옵니다. 이 파일과 스키마 정보는 DataReader의 데이터 원본을 제공하는 DataSet를 만드는 데 사용됩니다. 보고서 디자이너는 DataReader.Read를 사용하여 보고서의 DataSet 데이터에 액세스합니다.
확장을 구현하는 데 필요한 작업
Microsoft Visual Studio에서 새 Class Library 프로젝트를 열고 Microsoft.ReportingServices.Interfaces.dll에 참조를 추가합니다. 여기에는 데이터 처리 확장 인터페이스에 대해 참조해야 하는 Microsoft.ReportingServices.DataProcessing 네임스페이스가 포함됩니다.
가장 중요한 작업은 IDbTransaction, IDataParameter 및 IDataParameterCollection 인터페이스를 구현하는 클래스를 처리하는 것입니다. 이러한 클래스는 모든 데이터 처리 확장에 필요하므로 가장 먼저 처리해야 합니다. 이 구현에서는 관계형 데이터베이스와 통신하기 위해 데이터베이스에 연결하거나, 데이터를 수정하거나, 구조적 언어를 사용하지 않으므로, 해당 클래스가 사용되지 않습니다. 해당 클래스는 이 문서에 제공되는 샘플 코드에 표시된 대로 모두 기본 형식으로 구현할 수 있습니다.
참고 응용 프로그램에 따라 이러한 인터페이스를 보다 완전하게 구현해야 하는 경우도 있습니다. 관계형 데이터를 검색하고, 처리하고, DataSet를 만든 다음 해당 DataSet에 대해 보고하려는 경우 이러한 인터페이스를 사용해야 합니다.
구현의 핵심
필수적인 요소이면서도 불필요한 클래스라는 사실이 이상할 수도 있지만, 이 확장에서 실제로 작동하는 IDbConnection, IDbCommand 및 IDataReader 구현에 대해 살펴보겠습니다.
데이터베이스에 연결하지 않기 때문에 사실상 두 가지 작업에 연결 클래스를 사용합니다. 첫 번째는 SetConfiguration 메서드를 사용하여, XML 데이터의 유효성을 검사하는 데 사용해야 하는 스키마에 대한 정보를 config 파일에서 검색하는 작업입니다. 사용할 데이터 종류에 맞추기 위해 항상 업데이트할 수 있으므로 스키마 정보를 저장하면 응용 프로그램의 유연성이 보다 향상됩니다. 실제로 사용되는 두 가지 config 파일이 있습니다. 보고서 개발자에게 대상 보고서 서버에 액세스할 수 있는 권한이 없으므로, 보고서 디자이너와 보고서 서버에는 별도의 구성 정보 소스가 필요합니다. RSReportServer.config는 배포된 보고서의 확장 정보에 액세스하고, RSReportDesigner.config는 디자이너 UI에 사용되는 확장 정보에 액세스합니다. 이 두 구성 파일에는 데이터 처리 확장을 식별하는 동일한 항목이 있어야 합니다.
Connection 클래스를 사용하는 두 번째 메서드는 CreateCommand입니다. 이 메서드는 Connection 개체 오버로드를 사용하여 Command 개체를 만듭니다. 이 개체를 만들면 Command 개체 컨텍스트의 구성 정보에 액세스할 수 있습니다. IDbConnection의 다른 모든 구성원에게는 필요한 최소 구현만 제공됩니다.
using System; using System.Data; using System.Configuration; using System.Xml; using Microsoft.ReportingServices.DataProcessing; namespace Microsoft.Samples.ReportingServices.DataSetExtension { public class DSXConnection : Microsoft.ReportingServices.DataProcessing.IDbConnection { private string _connString; // IDbConnection.ConnectionTimeout은 기본적으로 15초입니다. private int _connTimeout = 15; private ConnectionState _state = ConnectionState.Closed; private string _locName = "DataSet Data Extension"; internal string _xmlSchema; // 기본 생성자 public DSXConnection() { } // 연결 문자열 생성자 오버로드 public DSXConnection(string connString) { _connString = connString; } public string ConnectionString { get { return _connString; } set { _connString = value; } } public int ConnectionTimeout { get { return _connTimeout; } } public ConnectionState State { get { return _state; } } // 사용되지 않음 public Microsoft.ReportingServices.DataProcessing.IDbTransaction BeginTransaction() { return (null); } // 사용되지 않음 public void Open() { _state = ConnectionState.Open; return; } // 사용되지 않음 public void Close() { _state = ConnectionState.Closed; return; } // 구현됨 public Microsoft.ReportingServices.DataProcessing.IDbCommand CreateCommand() { // 구성 정보를 제공하기 위해 Command 개체를 // 만들고 Connection 개체에 전달합니다. return new DSXCommand(this); } public string LocalizedName { get { return _locName; } } // 구현됨. IDbConnection을 통해 // IExtension에서 상속됩니다. public void SetConfiguration(string configuration) { // config 파일 설정에서 // XML 스키마 파일을 가져옵니다. XmlDocument schemaDoc = new XmlDocument(); schemaDoc.LoadXml(configuration); if (schemaDoc.DocumentElement.Name == "XSDConfiguration") { foreach (XmlNode schemaChild in schemaDoc.DocumentElement.ChildNodes) { if(schemaChild.Name == "XSDFile") { _xmlSchema = schemaChild.InnerText; } else { throw new Exception ("XSD 구성 요소를 찾을 수 없습니다."); } } } else { throw new Exception ("구성 파일에서 데이터를 반환하는 중 오류가 발생했습니다."); } } public void Dispose() { } } } (참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)다음 내용은 IDbCommand의 구현입니다. Connection 클래스와 마찬가지로, Command 클래스의 경우에도 이 작업을 수행하는 데는 몇 가지 구성원만 있으면 됩니다. 이 작업에 필요한 구성원은 생성자의 Connection 개체 오버로드, CommandText 속성 및 ExecuteReader 메서드의 CommandBehavior 오버로드입니다.
오버로드된 생성자는 Connection 개체에 대한 참조를 제공합니다. 여기서 DSXConnection의 내부 변수로 설정되어 있는 XML 스키마 정보에 액세스하기만 하면 됩니다. 이 변수는 XML 데이터 원본을 처리하는 데 사용될 수 있도록 나중에 ExecuteReader 호출에서 DataRecorder 구현으로 전달됩니다.
CommandText 속성은 데이터를 가져오는 XML 파일을 식별하는 쉼표로 구분된 문자열을 사용하며, 새 보고서를 설정할 때 이 속성이 보고서 디자이너에 입력됩니다.
ExecuteReader 호출은 DataReader를 생성하고, 데이터 원본으로 사용할 DataSet를 생성하고, 판독기를 호출자(이 경우에는 보고서)에게 반환합니다. SchemaOnly CommandBehavior 값을 지원하려면 CommandBehavior 오버로드를 구현해야 합니다. 보고서 디자이너와 보고서 서버 모두에서 매개 변수가 없는 버전이 아닌 이 오버로드를 사용하여 데이터뿐만 아니라 필드 정보도 가져옵니다.
using System; using System.Data; using System.ComponentModel; using Microsoft.ReportingServices.DataProcessing; namespace Microsoft.Samples.ReportingServices.DataSetExtension { public class DSXCommand : Microsoft.ReportingServices.DataProcessing.IDbCommand { private string _cmdText; private DSXConnection _connection; // IDbCommand.CommandTimeout은 기본적으로 30초입니다. private int _cmdTimeout = 30; private Microsoft.ReportingServices.DataProcessing.CommandType _cmdType; private DSXParameterCollection _parameters = new DSXParameterCollection(); // 기본 생성자 public DSXCommand() { } // 명령 텍스트 생성자 오버로드 public DSXCommand(string cmdText) { _cmdText = cmdText; } // Connection 개체 생성자 오버로드 public DSXCommand(DSXConnection connection) { _connection = connection; } public string CommandText { get { return _cmdText; } set { _cmdText = value; } } public int CommandTimeout { get {return _cmdTimeout;} set {_cmdTimeout = value;} } public Microsoft.ReportingServices.DataProcessing.CommandType CommandType { get { return _cmdType; } set { _cmdType = value; } } public Microsoft.ReportingServices.DataProcessing.IDataParameterCollection Parameters { get { return _parameters; } } public Microsoft.ReportingServices.DataProcessing.IDbTransaction Transaction { get { return (null); } set { throw new NotSupportedException(); } } // 사용되지 않음 public void Cancel() { throw new NotSupportedException(); } // 사용되지 않음 public Microsoft.ReportingServices.DataProcessing.IDataParameter CreateParameter() { return (null); } // 구현됨 public Microsoft.ReportingServices.DataProcessing.IDataReader ExecuteReader (Microsoft.ReportingServices.DataProcessing.CommandBehavior behavior) { try { // DataReader를 만듭니다. DSXDataReader testReader = new DSXDataReader(_cmdText); // DataSet를 채우는 // 사용자 지정 메서드를 호출합니다. testReader.CreateDataSet(_connection._xmlSchema); // DataReader를 반환합니다. return testReader; } catch(Exception e) { throw new Exception(e.Message); } } public void Dispose() { } } }마지막으로, IDataReader를 구현하는 DataReader 클래스가 있습니다. 이 클래스는 구성원 중 대부분이 보고서 디자이너에서 표시할 데이터를 검색하는 데 사용되므로 세 클래스 중에서 가장 구체적으로 구현됩니다. 또한 추가 기능을 제공하는 CreateDataSet 및 ParseCmdText와 같은 두 개의 사용자 지정 함수도 있습니다. ParseCmdText는 쉼표로 구분된 XML 소스 파일의 입력 문자열 구문을 분석하며, CreateDataSet는 이러한 소스 파일을 보고하는 데 사용할 단일 DataSet로 병합합니다. 그런 다음 결과 DataSet는 DataReader가 반환하는 데이터의 원본으로 사용됩니다.
using System; using System.Data; using System.Xml; using System.Collections; using Microsoft.ReportingServices.DataProcessing; namespace Microsoft.Samples.ReportingServices.DataSetExtension { public class DSXDataReader : Microsoft.ReportingServices.DataProcessing.IDataReader { private string _cmdText; private int _currentRow = 0; private int _fieldCount = 0; private string _fieldName; private int _fieldOrdinal; private Type _fieldType; private object _fieldValue; private DataSet _ds = null; // 기본 생성자 internal DSXDataReader() { } // 명령 텍스트 생성자 오버로드 internal DSXDataReader(string cmdText) { _cmdText = cmdText; } // 구현됨. 보고서 서버에서 // DataSet 데이터를 // 반환하기 위해 호출됩니다. public bool Read() { _currentRow++; if (_currentRow >= _ds.Tables[0].Rows.Count) { return (false); } else { return (true); } } public int FieldCount { get { _fieldCount = _ds.Tables[0].Columns.Count; return _fieldCount; } } public string GetName(int i) { _fieldName = _ds.Tables[0].Columns[i].ColumnName; return _fieldName; } public Type GetFieldType(int i) { _fieldType = _ds.Tables[0].Columns[i].DataType; return _fieldType; } public Object GetValue(int i) { _fieldValue = _ds.Tables[0].Rows[this._currentRow][i]; return _fieldValue; } public int GetOrdinal(string name) { _fieldOrdinal = _ds.Tables[0].Columns[name].Ordinal; return _fieldOrdinal; } // 입력 매개 변수는 // Connection.SetConfiguration 호출에서 // 검색된 .xsd 파일의 경로여야 합니다. internal void CreateDataSet(string schemaFile) { // 데이터를 보관할 XML doc를 엽니다. XmlDocument xmlDoc = new XmlDocument(); // DataSet를 만듭니다. DataSet ds = new DataSet("Customers"); // DataSet의 스키마를 만듭니다. ds.ReadXmlSchema(schemaFile); // 파일의 명령 텍스트 문자열을 구문 분석합니다. string[] parameters = this.ParseCmdText(); // XML 데이터를 가져와 // DataSet로 병합합니다. try { for(int i=0;i<parameters.GetLength(0);i++) { DataSet tempDs = new DataSet(); tempDs.ReadXml(parameters[i]); ds.Merge(tempDs); } } catch (Exception e) { throw new Exception(e.Message); } // DataRecorder의 나머지 구성원에서 // 사용되는 DataSet 변수를 // 방금 생성한 값으로 설정합니다. _ds = ds; // 읽을 준비를 위해 // 현재 행을 -1로 설정합니다. _currentRow = -1; } private string[] ParseCmdText() { // 명령 텍스트 형식을 검사합니다. if (_cmdText.IndexOf(",") != -1) { string[] dsParams = _cmdText.Split(new Char[]{','}); // 제품 코드에서는 // 문자열 값이 적절한 XML 파일 이름인지 // 확인하는 등의 추가적인 // 오류 처리 작업이 필요할 수 있습니다. return dsParams; } else throw new ArgumentException ("The CommandText value is not in the appropriate format."); } public void Dispose() { } } }물론, 일부 처리를 수행하고 DataSet를 생성하는 중간 계층 구성 요소를 이미 가지고 있어서, 확장 코드에 새 DataSet를 추가하지 않고 해당 중간 계층 구성 요소를 사용할 수도 있습니다. 이러한 경우 작업은 매우 간단합니다. 다음과 같이 어셈블리에 대한 참조를 추가하고 이 참조에서 DataSet를 반환하는 메서드를 호출하기만 하면 됩니다.
using System; using System.Data; using System.Xml; using System.Collections; using Microsoft.ReportingServices.DataProcessing; using ThisCompany.ThisAssembly; namespace ThisCompany.ThisNamespace.DataSetExtension { public class ExtensionDataReader : Microsoft.ReportingServices.DataProcessing.IDataReader { private DataSet _ds = null; // 추가 변수... internal ExtensionDataReader(thisParameter) { // 중간 계층 어셈블리에서 DataSet를 가져옵니다. this._ds = new ThisCompany.ThisAssembly. Customer.IntegrateDataSources (thisParameter); // 현재 행을 설정합니다. currentRow = -1; } ...이 보고서 실행 시 보고서 서버가 수행하는 작업을 순서대로 간단히 요약하면 아래와 같습니다.
- DSXConnection 기본 생성자를 호출합니다.
- DSXCommand Connection 오버로드 생성자를 사용하여 Command 개체를 만드는 DSXConnection.CreateCommand를 호출합니다.
- 그런 다음 DSXCommand.ExecuteReader(CommandBehavior)를 호출합니다.
- DSXDataReader 명령 텍스트 오버로드 생성자를 호출하여 DataReader 개체를 만듭니다.
- DSXDataReader.CreateDataSet를 호출하여 DataSet 데이터 원본을 만듭니다. 이 메서드는 DSXDataReader.ParseCmdText를 호출하여 입력을 확인합니다.
- 처리가 DSXCommand.ExecuteReader(CommandBehavior)로 반환되어 DataReader가 보고서 서버로 다시 전달됩니다.
확장 코드가 구현되었습니다. 정말 간단하죠?
계속 진행하여 솔루션을 구축할 수도 있습니다. 이제 배포에 대해 알아보겠습니다.
확장 배포
먼저 확장 DLL을 보고서 서버 및 보고서 디자이너 디렉터리로 복사하고 config 파일에 적절한 항목을 추가하여 Reporting Services에서 해당 확장을 등록해야 합니다.
RSCustomData.DLL을 복사하여 보고서 서버 bin 디렉터리(기본 디렉터리: C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\ReportServer\bin)와 보고서 디자이너 디렉터리(기본 디렉터리: C:\Program Files\Microsoft SQL Server\80\Tools\Report Designer)에 붙여넣습니다. 그런 다음 기본적으로 C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\ReportServer에 있는 보고서 서버 config 파일 RSReportServer.config를 엽니다. <Data> 노드의 새 <Extension> 자식 노드를 추가하도록 이 파일을 수정하여 확장에서 사용할 모든 설정을 문서화해야 합니다. <Extension> 요소에는 두 가지 속성이 필요합니다. 첫 번째 속성인 Name은 개발자가 선택하는 확장의 고유한 이름이며, 두 번째 속성인 Type은 연결 클래스의 정규화된 이름과 어셈블리의 이름(.dll 확장명 제외)이며 이 이름은 쉼표로 구분됩니다. 필요한 속성이 이 두 가지입니다. 이 샘플에서는 <Configuration> 노드를 사용하지만, 실제로 사용하지 않을 경우에는 생략해도 됩니다. 새 노드는 다음과 같습니다.
<Data> <Extension Name="DataSet" Type="Microsoft.Samples.ReportingServices.DataSetExtension.DSXConnection,RSCustomData"> <Configuration> <XSDConfiguration> <XSDFile> C:\customer.xsd </XSDFile> </XSDConfiguration> </Configuration> </Extension> </Data>보고서 서버 config 파일을 저장하고 닫은 다음 C:\Program Files\Microsoft SQL Server\80\Tools\Report Designer에 있는 보고서 디자이너 중 하나인 RSReportDesigner.config를 엽니다. 동일한 <Extension> 노드를 이 파일의 <Data> 섹션에도 추가합니다. 또한 조금 다른 <Extension> 요소를 <Designer> 노드에도 추가해야 합니다. 이 <Extension> 요소에는 Name 및 Type 특성도 포함됩니다. Name 특성에는 <Data> 노드의 <Extension> 요소에 지정한 것과 동일한 고유 확장 이름도 포함되어 있어야 합니다. Type 특성은 일반 쿼리 디자이너 클래스의 정규화된 이름과 이 클래스를 포함하는 어셈블리의 이름(.dll 확장명 제외)이며 이 이름은 쉼표로 구분됩니다.
<Extension Name="DataSet" Type="Microsoft.ReportDesigner.Design.GenericQueryDesigner,Microsoft.ReportingServices.Designer" />일반 인터페이스는 관계형 데이터베이스에 가장 적합한 완전한 시각적 쿼리 디자이너가 아닌 디자이너 UI가 간단한 쿼리 및 결과 창을 통해 확장을 사용하여 작업할 수 있도록 해줍니다.
코드 액세스 보안
다음으로 해야 할 작업은 확장에 대한 코드 액세스 권한을 명시적으로 설정하는 보고서 서버 및 보고서 디자이너 정책 파일에 항목을 추가하는 것입니다. 데이터 처리 확장을 사용하려면 적절하게 실행할 수 있는 FullTrust 권한이 있어야 합니다.
보고서 서버 정책 파일 rssrvpolicy.config(기본 디렉터리: C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\ReportServer)를 열고 다음과 일치하는 새 <CodeGroup> 노드를 만듭니다.
<CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Name="DataSetExtensionGroup" Description="This code group grants data extensions full trust."> <IMembershipCondition class="UrlMembershipCondition" version="1" Url="C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\ReportServer\bin\RSCustomData.dll" /> </CodeGroup>그런 다음, 동일한 <CodeGroup> 노드를 보고서 디자이너 정책 파일 rspreviewpolicy.config(기본 디렉터리: C:\Program Files\Microsoft SQL Server\80\Tools\Report Designer)에 추가합니다.
이러한 항목은 확장 어셈블리를 식별하는 URL 증거에 따라 DataSet 데이터 처리 확장 FullTrust 권한을 부여합니다. 코드 액세스 보안 관리에 대한 자세한 내용은 Code Access Security in SQL Server 2000 Reporting Services 를 참고하십시오.
보고서 만들기
지금까지 DataSet 확장을 만들고 배포했습니다. 이제 보고서에서 이 확장을 사용해 보겠습니다. Visual Studio를 열고 새 보고서 프로젝트를 시작합니다. Shared Data Sources(공유 데이터 원본) 폴더를 마우스 오른쪽 단추로 클릭하고 Add New Data Source(새 데이터 원본 추가)를 선택합니다. Type(형식) 드롭다운 메뉴에 DataSet 데이터 처리 확장에 대한 항목이 표시됩니다.
그림 1. 공유 데이터 원본 폴더
확장 항목을 선택한 후, 데이터베이스 연결을 만들지 않기 때문에 자격 증명이 필요하지 않으므로 Credentials(자격 증명) 창에서 No Credentials(자격 증명 사용 안 함) 라디오 단추를 선택합니다. 이 데이터 원본을 저장합니다.
Reports(보고서) 폴더를 마우스 오른쪽 단추로 클릭하고 Add New Report(새 보고서 추가)를 선택합니다. 보고서 마법사를 시작하고 단계별로 진행합니다. Select the Data Source(데이터 원본 선택) 화면에서, 방금 만든 DataSet 확장 데이터 원본에 대한 기본 선택 사항을 그대로 적용합니다.
그림 2. 데이터 원본 선택 화면
Design the Query(쿼리 디자인) 화면에서 모든 XML 소스 파일의 전체 경로를 포함하는 쉼표로 구분된 문자열을 입력합니다.
그림 3. 쿼리 디자인 화면
필요한 모든 설정을 사용하여 보고서를 완료합니다. 이 샘플에서는 기본 설정만을 사용했습니다. 미리 보기를 실행하면 샘플 보고서가 다음과 유사하게 표시됩니다. 여기서는 공간상의 문제로 필드 레이아웃을 조금 수정했습니다.
그림 4. Reporting Services 샘플 보고서
보고서를 배포하려면 프로젝트 속성에서 대상 보고서 서버(일반적으로 http://MachineName/ReportServer)를 지정한 후, Debug(디버그) -> Start(시작)를 선택하여 솔루션을 배포하고 브라우저에서 보고서를 확인합니다.
결론
위에서 보셨듯이, API의 특성과 구성 요구 사항을 해결하고 나면 Reporting Services에서 DataSet에 쉽게 액세스할 수 있습니다. 다음에는 보고 응용 프로그램 중 하나에서 기존 데이터 처리 기능을 활용해 보십시오.
관련 서적
'.net' 카테고리의 다른 글
ASP.NET Popup Control (0) | 2007.05.03 |
---|---|
ASP.NET에서 쿠키의 기본 개념 (0) | 2007.05.03 |
DataSet 엑셀로 다운로드하기 (2) | 2007.05.03 |
ASP.NET 2.0 및 데이터 바인딩된 컨트롤 (0) | 2007.05.03 |
프리젠테이션 레이어 설계 (0) | 2007.05.03 |