惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Vulnerabilities – Threatpost
Cloudbric
Cloudbric
G
GRAHAM CLULEY
S
Securelist
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Project Zero
Project Zero
Spread Privacy
Spread Privacy
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
T
Tailwind CSS Blog
博客园_首页
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Attack and Defense Labs
Attack and Defense Labs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
O
OpenAI News
J
Java Code Geeks
T
Tenable Blog
K
Kaspersky official blog
AWS News Blog
AWS News Blog
S
Security @ Cisco Blogs
The GitHub Blog
The GitHub Blog
T
Threatpost
月光博客
月光博客
H
Heimdal Security Blog
Security Latest
Security Latest
The Hacker News
The Hacker News
Y
Y Combinator Blog
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
C
Cisco Blogs
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
D
Docker
Google Online Security Blog
Google Online Security Blog
D
DataBreaches.Net
V
Visual Studio Blog
H
Help Net Security

博客园 - 小新0574

PayPal使用介绍 - 注册篇 VB6.0 IDE即将退出历史舞台 工作一年半记录 随便说说Silverlight 最近在学英语 真正理解ViewState - Part2 真正理解ViewState - part1 本地模式使用ReportViewer控件 编程使用资源文件实现多语言页面(In Action) ADO.NET2.0跟ADO.NET3.0的一些新特性简要介绍 关于Membership的设置 使用WebService动态生成DataSet绑定到Reporting Services 可爱的上海人 Just a Test 回到了学校 到了上海 打算近期去深圳找工作 ASP.NET中的事件 第一天学习《Essential ASP.NET...》情况
本地生成RDL报表文件的创建工具
小新0574 · 2006-08-23 · via 博客园 - 小新0574

昨天尝试了一下,不使用Web Service,本地使用同样的方法

        string strCon;

        DataSet ds 
= new DataSet();
        XmlDataDocument xmlDataDoc;

        strCon 
= "Server=10.100.3.248;initial catalog=IGS-SMP-WorkTest;User Id=WorkDeveloper;Password=developer;";

        
string selectText = "SELECT * FROM SMP_WorkItem";

        SqlDataAdapter dataAdapter 
= new SqlDataAdapter(selectText, strCon);


        
try
        
{
            dataAdapter.Fill(ds);

            xmlDataDoc 
= new XmlDataDocument(ds);

            
using(XmlTextWriter writer = new XmlTextWriter("Your Report Location",System.Text.Encoding.UTF8))
            
{

         
            xmlDataDoc.WriteTo(writer);
       
            writer.Flush();
            }


        }

        
catch
        
{
            xmlDataDoc 
= null;
        }

        
finally
        
{
            strCon 
= null;
            ds.Dispose();
        }

    }

然后在Shared Data Source里指定生成的文件路径,Query String根据微软的说明,为空就可以了。
但是不能正确识别XML文件格式,参照向导生成的格式,缺少了很多元素。

通过查找资料的时候发现一个解决方案,我们可以自己制作一个报表生成器,步骤如下:

1. 新建一个Console Application,建立报表生成器:

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Xml;

namespace RDLGenerator
{
    
class RdlGenerator
    
{
        SqlConnection m_connection;
        
string m_connectString;
        
string m_commandText;
        ArrayList m_fields;

        
public static void Main()
        
{
            RdlGenerator myRdlGenerator 
= new RdlGenerator();
            myRdlGenerator.Run();
        }


        
public void Run()
        
{
            
try
            
{
                
// Call methods to create the RDL
                this.OpenConnection();
                
this.GenerateFieldsList();
                
this.GenerateRdl();

                Console.WriteLine(
"RDL file generated successfully.");
            }


            
catch (Exception exception)
            
{
                Console.WriteLine(
"An error occurred: " + exception.Message);
            }


            
finally
            
{
                
// Close the connection string
                m_connection.Close();
            }

        }


        
public void OpenConnection()
        
{
            TODO:OpenConnection
        }



        
public void GenerateFieldsList()
        
{
            TODO:GenerateFieldsList
        }



        
public void GenerateRdl()
        
{
           TODO: GenerateRdl
        }



    }

}

2.创建你自己的数据库连接:

        public void OpenConnection()
        
{
            
// Create a connection object
            m_connection = new SqlConnection();

            
// Create the connection string
            m_connectString = "Your Connnection String
            m_connection.ConnectionString = m_connectString;

            
// Open the connection
            m_connection.Open();
        }

3.获取你需要的数据:


        
public void GenerateFieldsList()
        
{
            SqlCommand command;
            SqlDataReader reader;

            
// Executing a query to retrieve a fields list for the report
            command = m_connection.CreateCommand();
            m_commandText 
=
               
"Your SELECT STRING";
            command.CommandText 
= m_commandText;

            
// Execute and create a reader for the current command
            reader = command.ExecuteReader(CommandBehavior.SchemaOnly);

            
// For each field in the resultset, add the name to an array list
            m_fields = new ArrayList();
            
for (int i = 0; i <= reader.FieldCount - 1; i++)
            
{
                m_fields.Add(reader.GetName(i));
            }

        }

4.创建报表XML:

        public void GenerateRdl()
        
{
            
// Open a new RDL file stream for writing
            FileStream stream;
            stream 
= File.OpenWrite("Report1.rdl");
            XmlTextWriter writer 
= new XmlTextWriter(stream, Encoding.UTF8);

            
// Causes child elements to be indented
            writer.Formatting = Formatting.Indented;

            
// Report element
            writer.WriteProcessingInstruction("xml""version=\"1.0\" encoding=\"utf-8\"");
            writer.WriteStartElement(
"Report");
            writer.WriteAttributeString(
"xmlns"null"http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
            writer.WriteAttributeString(
"xmlns:rd"null"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
            writer.WriteElementString(
"Width""6in");

            
// DataSource element
            writer.WriteStartElement("DataSources");
            writer.WriteStartElement(
"DataSource");
            writer.WriteAttributeString(
"Name"null"DataSource1");
            writer.WriteStartElement(
"ConnectionProperties");
            writer.WriteElementString(
"DataProvider""SQL");
            writer.WriteElementString(
"ConnectString", m_connectString);
            writer.WriteElementString(
"IntegratedSecurity""false");
            writer.WriteEndElement(); 
// ConnectionProperties
            writer.WriteEndElement(); // DataSource
            writer.WriteEndElement(); // DataSources

            
// DataSet element
            writer.WriteStartElement("DataSets");
            writer.WriteStartElement(
"DataSet");
            writer.WriteAttributeString(
"Name"null"DataSet1");

            
// Query element
            writer.WriteStartElement("Query");
            writer.WriteElementString(
"DataSourceName""DataSource1");
            writer.WriteElementString(
"CommandType""Text");
            writer.WriteElementString(
"CommandText", m_commandText);
            writer.WriteElementString(
"Timeout""30");
            writer.WriteEndElement(); 
// Query

            
// Fields elements
            writer.WriteStartElement("Fields");
            
foreach (string fieldName in m_fields)
            
{
                writer.WriteStartElement(
"Field");
                writer.WriteAttributeString(
"Name"null, fieldName);
                writer.WriteElementString(
"DataField"null, fieldName);
                writer.WriteEndElement(); 
// Field
            }


            
// End previous elements
            writer.WriteEndElement(); // Fields
            writer.WriteEndElement(); // DataSet
            writer.WriteEndElement(); // DataSets

            
// Body element
            writer.WriteStartElement("Body");
            writer.WriteElementString(
"Height""5in");

            
// ReportItems element
            writer.WriteStartElement("ReportItems");

            
// Table element
            writer.WriteStartElement("Table");
            writer.WriteAttributeString(
"Name"null"Table1");
            writer.WriteElementString(
"DataSetName""DataSet1");
            writer.WriteElementString(
"Top"".5in");
            writer.WriteElementString(
"Left"".5in");
            writer.WriteElementString(
"Height"".5in");
            writer.WriteElementString(
"Width", (m_fields.Count * 1.5+ "in");

            
// Table Columns
            writer.WriteStartElement("TableColumns");
            
for (int i = 0; i < m_fields.Count; i++)
            
{
                writer.WriteStartElement(
"TableColumn");
                writer.WriteElementString(
"Width""1.5in");
                writer.WriteEndElement(); 
// TableColumn
            }

            writer.WriteEndElement(); 
// TableColumns

            
// Header Row
            writer.WriteStartElement("Header");
            writer.WriteStartElement(
"TableRows");
            writer.WriteStartElement(
"TableRow");
            writer.WriteElementString(
"Height"".25in");
            writer.WriteStartElement(
"TableCells");

            
foreach (string fieldName in m_fields)
            
{
                writer.WriteStartElement(
"TableCell");
                writer.WriteStartElement(
"ReportItems");

                
// Textbox
                writer.WriteStartElement("Textbox");
                writer.WriteAttributeString(
"Name"null"Header" + fieldName);

                writer.WriteStartElement(
"Style");
                writer.WriteElementString(
"TextDecoration""Underline");
                writer.WriteEndElement(); 
// Style

                writer.WriteElementString(
"Top""0in");
                writer.WriteElementString(
"Left""0in");
                writer.WriteElementString(
"Height"".5in");
                writer.WriteElementString(
"Width""1.5in");
                writer.WriteElementString(
"Value", fieldName);
                writer.WriteEndElement(); 
// Textbox

                writer.WriteEndElement(); 
// ReportItems
                writer.WriteEndElement(); // TableCell
            }


            writer.WriteEndElement(); 
// TableCells
            writer.WriteEndElement(); // TableRow
            writer.WriteEndElement(); // TableRows
            writer.WriteEndElement(); // Header

            
// Details Row
            writer.WriteStartElement("Details");
            writer.WriteStartElement(
"TableRows");
            writer.WriteStartElement(
"TableRow");
            writer.WriteElementString(
"Height"".25in");
            writer.WriteStartElement(
"TableCells");

            
foreach (string fieldName in m_fields)
            
{
                writer.WriteStartElement(
"TableCell");
                writer.WriteStartElement(
"ReportItems");

                
// Textbox
                writer.WriteStartElement("Textbox");
                writer.WriteAttributeString(
"Name"null, fieldName);

                writer.WriteStartElement(
"Style");
                writer.WriteEndElement(); 
// Style

                writer.WriteElementString(
"Top""0in");
                writer.WriteElementString(
"Left""0in");
                writer.WriteElementString(
"Height"".5in");
                writer.WriteElementString(
"Width""1.5in");
                writer.WriteElementString(
"Value""=Fields!" + fieldName + ".Value");
                writer.WriteElementString(
"HideDuplicates""DataSet1");
                writer.WriteEndElement(); 
// Textbox

                writer.WriteEndElement(); 
// ReportItems
                writer.WriteEndElement(); // TableCell
            }


            
// End Details element and children   
            writer.WriteEndElement(); // TableCells
            writer.WriteEndElement(); // TableRow
            writer.WriteEndElement(); // TableRows
            writer.WriteEndElement(); // Details

            
// End table element and end report definition file
            writer.WriteEndElement(); // Table
            writer.WriteEndElement(); // ReportItems
            writer.WriteEndElement(); // Body
            writer.WriteEndElement(); // Report

            
// Flush the writer and close the stream
            writer.Flush();
            stream.Close();
        }

5.编译运行你的程序,选择Start Without Debugging.

然后一个rdl格式的报表文件就生成在你制定的目录了,你只要在Report Services Project中添加这个报表进一步设计就可以了。

不过我们可以主要到GenerateRdl方法中的XML基本都是手动方式添加元素,如果把前面的SqlDataReader换成DataSet,那么GenerateRdl方法中的语句也要重写,所以不是特别方便。

这里只是提供一种选择,是好事坏,是否选择,那就是使用者自己的事情了。