昨天尝试了一下,不使用Web Service,本地使用同样的方法
然后在Shared Data Source里指定生成的文件路径,Query String根据微软的说明,为空就可以了。
但是不能正确识别XML文件格式,参照向导生成的格式,缺少了很多元素。
通过查找资料的时候发现一个解决方案,我们可以自己制作一个报表生成器,步骤如下:
1. 新建一个Console Application,建立报表生成器:
2.创建你自己的数据库连接:
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:
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();
}
}
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
}
}
}
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.获取你需要的数据:{
// 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();
}
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();
}
{
// 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方法中的语句也要重写,所以不是特别方便。
这里只是提供一种选择,是好事坏,是否选择,那就是使用者自己的事情了。