下載地址:http://www.rubylong.cn/download/Grid++Report6.zip
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Web; using System.Configuration; using System.IO; using System.IO.Compression; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.OleDb; namespace QianxunApplication.Common { ///////////////////////////////////////////////////////////////////////////////////////////////////////// //以下枚舉指定報表數據的格式類型 public enum ResponseDataType { PlainText, //報表數據為XML或JSON文本,在調試時可以查看報表數據。數據未經壓縮,大數據量報表采用此種方式不合適 ZipBinary, //報表數據為XML或JSON文本經過壓縮得到的二進制數據。此種方式數據量最小(約為原始數據的1/10),但用Ajax方式加載報表數據時不能為此種方式 ZipBase64, //報表數據為將 ZipBinary 方式得到的數據再進行 BASE64 編碼的數據。此種方式適合用Ajax方式加載報表數據 }; ///////////////////////////////////////////////////////////////////////////////////////////////////////// // ReportQueryItem public class ReportQueryItem { public string QuerySQL; public string RecordsetName; public ReportQueryItem(string AQuerySQL, string ARecordsetName) { QuerySQL = AQuerySQL; RecordsetName = ARecordsetName; } }; ///////////////////////////////////////////////////////////////////////////////////////////////////////// // ReportDataBase public class ReportDataBase { //指定報表的默認數據類型,便於統一定義整個報表系統的數據類型 //在報表開發調試階段,通常指定為 ResponseDataType.PlainText, 以便在瀏覽器中查看響應的源文件時能看到可讀的文本數據 //在項目部署時,通常指定為 ResponseDataType.ZipBinary 或 ResponseDataType.ZipBase64,這樣可以極大減少數據量,提供報表響應速度 public const ResponseDataType DefaultDataType = ResponseDataType.PlainText; //PlainText ZipBinary ZipBase64 //將報表XML數據文本輸出到HTTP請求 public static void ResponseData(System.Web.UI.Page DataPage, ref string DataText, ResponseDataType DataType) { //報表XML數據的前后不能附加任何其它數據,否則XML數據將不能成功解析,所以調用ClearContent方法清理網頁中前面多余的數據 DataPage.Response.ClearContent(); if (ResponseDataType.PlainText == DataType) { // 把xml對象發送給客戶端 //DataPage.Response.ContentType = "text/xml"; DataPage.Response.Write(DataText); } else { //將string數據轉換為byte[],以便進行壓縮 System.Text.UTF8Encoding converter = new System.Text.UTF8Encoding(); byte[] XmlBytes = converter.GetBytes(DataText); //在 HTTP 頭信息中寫入報表數據壓縮信息 DataPage.Response.AppendHeader("gr_zip_type", "deflate"); //指定壓縮方法 DataPage.Response.AppendHeader("gr_zip_size", XmlBytes.Length.ToString()); //指定數據的原始長度 DataPage.Response.AppendHeader("gr_zip_encode", converter.HeaderName); //指定數據的編碼方式 utf-8 utf-16 ... // 把壓縮后的xml數據發送給客戶端 if (ResponseDataType.ZipBinary == DataType) { DeflateStream compressedzipStream = new DeflateStream(DataPage.Response.OutputStream, CompressionMode.Compress, true); compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length); compressedzipStream.Close(); } else //ResponseDataType.ZipBase64 { MemoryStream memStream = new MemoryStream(); DeflateStream compressedzipStream = new DeflateStream(memStream, CompressionMode.Compress, true); compressedzipStream.Write(XmlBytes, 0, XmlBytes.Length); compressedzipStream.Close(); //這句很重要,這樣數據才能全部寫入 MemoryStream // Read bytes from the stream. memStream.Seek(0, SeekOrigin.Begin); // Set the position to the beginning of the stream. int count = (int)memStream.Length; byte[] byteArray = new byte[count]; count = memStream.Read(byteArray, 0, count); string Base64Text = Convert.ToBase64String(byteArray); DataPage.Response.Write(Base64Text); } } //報表XML數據的前后不能附加任何其它數據,否則XML數據將不能成功解析,所以調用End方法放棄網頁中后面不必要的數據 DataPage.Response.End(); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class XMLReportData 產生報表需要的xml數據 public class XMLReportData { //根據 DataSet 產生提供給報表需要的XML數據,參數DataType指定壓縮編碼數據的形式 public static void GenDataSet(System.Web.UI.Page DataPage, DataSet ReportDataSet, ResponseDataType DataType) { string XMLText = ReportDataSet.GetXml(); ReportDataBase.ResponseData(DataPage, ref XMLText, DataType); } //根據 DataTable 產生提供給報表需要的XML數據,參數DataType指定壓縮編碼數據的形式 public static void GenDataTable(System.Web.UI.Page DataPage, DataTable mydt, ResponseDataType DataType) { DataSet ds = new DataSet(); ds.Tables.Add(mydt); GenDataSet(DataPage, ds, DataType); } //根據IDataReader, 產生提供給報表需要的XML數據,其中的空值字段也會產生XML節點,參數DataType指定壓縮編碼數據的形式 public static void GenNodeXmlDataFromReader(System.Web.UI.Page DataPage, IDataReader dr, ResponseDataType DataType) { string XMLText = "<xml>\n"; while (dr.Read()) { XMLText += "<row>"; for (int i = 0; i < dr.FieldCount; ++i) { string FldName = dr.GetName(i); if (FldName == "") FldName = "Fld" + i; XMLText += String.Format("<{0}>{1}</{0}>", FldName, HttpUtility.HtmlEncode(dr.GetValue(i).ToString())); } XMLText += "</row>\n"; } XMLText += "</xml>\n"; ReportDataBase.ResponseData(DataPage, ref XMLText, DataType); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class JSONReportData 產生報表需要的 JSON 格式數據 public class JSONReportData { //根據 DataSet 產生提供給報表需要的JSON數據,參數DataType指定壓縮編碼數據的形式 public static void GenDataSet(System.Web.UI.Page DataPage, DataSet ReportDataSet, ResponseDataType DataType) { string Out = GenDetailText(ReportDataSet); ReportDataBase.ResponseData(DataPage, ref Out, DataType); } //根據 DataTable 產生提供給報表需要的JSON數據,參數DataType指定壓縮編碼數據的形式 public static void GenDataTable(System.Web.UI.Page DataPage, DataTable dt, ResponseDataType DataType) { DataSet ds = new DataSet(); ds.Tables.Add(dt); GenDataSet(DataPage, ds, DataType); } //根據 DataSet 產生提供給報表需要的JSON文本數據 public static string GenDetailText(DataSet ds) { //如果這里編譯不過,請將項目屬性的“生成->目標 Framework”設置為“.Net FrameWork4”或更高版本 System.ServiceModel.Dispatcher.JsonQueryStringConverter jqsc = new System.ServiceModel.Dispatcher.JsonQueryStringConverter(); StringBuilder sbJSONText = new StringBuilder("{\n"); foreach (DataTable dt in ds.Tables) { //"recordset":[ sbJSONText.Append('"'); sbJSONText.Append(dt.TableName); sbJSONText.Append("\":[\n"); foreach (DataRow dr in dt.Rows) { sbJSONText.Append('{'); for (int i = 0; i < dt.Columns.Count; ++i) { if (!dr.IsNull(i)) { //用 ConvertValueToString 轉換,這樣數字類型才不會加引號 //如果日期類型也用ConvertValueToString轉換,則為 "\/Date(-152438400000+0800)\/" 這樣的形式 string Value; if (dt.Columns[i].DataType.IsArray) { Value = "\"" + Convert.ToBase64String((byte[])dr[i]) + "\""; } else if (dt.Columns[i].DataType == typeof(System.DateTime)) { Value = "\"" + dr[i].ToString() + "\""; } else { Value = jqsc.ConvertValueToString(dr[i], dt.Columns[i].DataType); } sbJSONText.AppendFormat("\"{0}\":{1},", dt.Columns[i].ColumnName, Value); } } sbJSONText.Remove(sbJSONText.Length - 1, 1); //去掉每筆記錄最后一個字段后面的"," sbJSONText.Append("},\n"); } if (dt.Rows.Count > 0) //如果無明細記錄,則不要回退 sbJSONText.Remove(sbJSONText.Length - 2, 1); //去掉最后一條記錄后面的"," sbJSONText.Append("],\n"); } sbJSONText.Remove(sbJSONText.Length - 2, 1); //去掉最后一記錄集后面的"," sbJSONText.Append("}"); return sbJSONText.ToString(); } ////如果數據中包含有JSON規范中的特殊字符(" \ \r \n \t),多特殊字符加 \ 編碼 //public static void PrepareValueText(ref string ValueText) //{ // bool HasSpecialChar = false; // foreach(char ch in ValueText) // { // if (ch == '"' || ch == '\\' || ch == '\r' || ch == '\n' || ch == '\t') // { // HasSpecialChar = true; // break; // } // } // if (HasSpecialChar) // { // StringBuilder NewValueText = new StringBuilder(); // foreach (char ch in ValueText) // { // if (ch == '"' || ch == '\\' || ch == '\r' || ch == '\n' || ch == '\t') // { // NewValueText.Append( '\\'); // if (ch == '"' || ch == '\\') // NewValueText.Append( ch ); // else if (ch == '\r') // NewValueText.Append( 'r' ); // else if (ch == '\n') // NewValueText.Append( 'n' ); // else if (ch == '\t') // NewValueText.Append( 't' ); // } // else // { // NewValueText.Append( ch ); // } // } // ValueText = NewValueText.ToString(); // } //} } public class SqlReportData { //★特別提示★: //連接SQL Server數據庫的連接串,應該修改為與實際一致。如果是運行Grid++Report本身的例子,應該首先附加例子數據庫到 //SQL Server2000/2005數據庫上。 //public const string SqlConnStr = "Data Source=(local);Initial Catalog=gridreport;Persist Security Info=True;User ID=sa;Password=;"; //public const string SqlConnStr = "Data Source=localhost;Initial Catalog=JiangZaiHua;User Id=Sa;Password=6665508a;"; public const string SqlConnStr = "Data Source=118.190.22.134,15427;Initial Catalog=JiangZaiHua;User Id=Sa;Password=Ukk`]wqzZNeN5hko;"; //定義在SQL中表示日期值的包圍符號,Access用“#”, 而MS SQl Server用“'”,為了生成兩者都可用的查詢SQL語句,將其參數化定義出來。這樣處理只是為了演示例子方便 public const char DateSqlBracketChar = '\''; //根據查詢SQL,產生提供給報表生成需要的 XML 數據,字段值為空也產生數據 public static void FullGenNodeXmlData(System.Web.UI.Page DataPage, string QuerySQL, bool ToCompress) { SqlConnection ReportConn = new SqlConnection(SqlConnStr); SqlCommand ReportDataCommand = new SqlCommand(QuerySQL, ReportConn); ReportConn.Open(); SqlDataReader ReportDataReader = ReportDataCommand.ExecuteReader(); XMLReportData.GenNodeXmlDataFromReader(DataPage, ReportDataReader, ToCompress ? ResponseDataType.ZipBinary : ResponseDataType.PlainText); ReportDataReader.Close(); ReportConn.Close(); } //獲取 Count(*) SQL 查詢到的數據行數。參數 QuerySQL 指定獲取報表數據的查詢SQL public static int BatchGetDataCount(string QuerySQL) { int Total = 0; SqlConnection ReportConn = new SqlConnection(SqlConnStr); SqlCommand ReportDataCommand = new SqlCommand(QuerySQL, ReportConn); ReportConn.Open(); SqlDataReader ReportDataReader = ReportDataCommand.ExecuteReader(); if (ReportDataReader.Read()) Total = ReportDataReader.GetInt32(0); ReportDataReader.Close(); ReportConn.Close(); return Total; } //<<protected function //根據查詢SQL,產生提供給報表生成需要的 XML 或 JSON 數據 protected static void DoGenDetailData(System.Web.UI.Page DataPage, string QuerySQL, ResponseDataType DataType, bool IsJSON) { SqlConnection ReportConn = new SqlConnection(SqlConnStr); SqlDataAdapter ReportDataAdapter = new SqlDataAdapter(QuerySQL, ReportConn); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); ReportDataAdapter.Fill(ReportDataSet); ReportConn.Close(); if (IsJSON) JSONReportData.GenDataSet(DataPage, ReportDataSet, DataType); else XMLReportData.GenDataSet(DataPage, ReportDataSet, DataType); } //>>protected function //特別提示:以下函數為兼容以前版本而保留,請勿再用之,無須兼容考慮可刪除之 //<<保留前面版本的函數,兼容以前版本所寫程序 //根據查詢SQL,產生提供給報表生成需要的 XML 數據,采用 Sql 數據引擎 public static void GenNodeXmlData(System.Web.UI.Page DataPage, string QuerySQL, bool ToCompress) { DoGenDetailData(DataPage, QuerySQL, ToCompress ? ResponseDataType.ZipBinary : ResponseDataType.PlainText, false); } //根據查詢SQL,產生提供給報表生成需要的 XML 數據,采用 Sql 數據引擎, 這里只產生報表參數數據 //當報表沒有明細時,調用本方法生成數據,查詢SQL應該只能查詢出一條記錄 public static void GenParameterReportData(System.Web.UI.Page DataPage, string ParameterQuerySQL) { DoGenDetailData(DataPage, ParameterQuerySQL, ResponseDataType.PlainText, false); } //根據查詢SQL,產生提供給報表生成需要的 XML 數據,采用 Sql 數據引擎, 根據RecordsetQuerySQL獲取報表明細數據,根據ParameterQuerySQL獲取報表參數數據 public static void GenEntireReportData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL, bool ToCompress) { SqlConnection ReportConn = new SqlConnection(SqlConnStr); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); SqlDataAdapter DataAdapter1 = new SqlDataAdapter(RecordsetQuerySQL, ReportConn); DataAdapter1.Fill(ReportDataSet, "Detail"); SqlDataAdapter DataAdapter2 = new SqlDataAdapter(ParameterQuerySQL, ReportConn); DataAdapter2.Fill(ReportDataSet, "Master"); ReportConn.Close(); XMLReportData.GenDataSet(DataPage, ReportDataSet, ReportDataBase.DefaultDataType); } //>>保留前面版本的函數,兼容以前版本所寫程序 } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class SqlXMLReportData 根據SQL產生報表需要的 XML 數據,采用 Sql 數據引擎 public class SqlXMLReportData : SqlReportData { public static void GenOneRecordset(System.Web.UI.Page DataPage, string QuerySQL) { SqlReportData.DoGenDetailData(DataPage, QuerySQL, ReportDataBase.DefaultDataType, false); } public static void GenMultiRecordset(System.Web.UI.Page DataPage, ArrayList QueryList) { SqlConnection ReportConn = new SqlConnection(SqlConnStr); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); foreach (ReportQueryItem item in QueryList) { SqlDataAdapter DataAdapter = new SqlDataAdapter(item.QuerySQL, ReportConn); DataAdapter.Fill(ReportDataSet, item.RecordsetName); } ReportConn.Close(); XMLReportData.GenDataSet(DataPage, ReportDataSet, ReportDataBase.DefaultDataType); } //特別提示:以下函數為兼容以前版本而保留,請勿再用之,無須兼容考慮可刪除之 //<<保留前面版本的函數,兼容以前版本所寫程序 //產生報表明細記錄數據,數據將被加載到明細網格的記錄集中 public static void GenDetailData(System.Web.UI.Page DataPage, string QuerySQL) { GenOneRecordset(DataPage, QuerySQL); } //這里只產生報表參數數據,數據加載到報表參數、非明細網格中的部件框中 //當報表沒有明細時,調用本方法生成數據,查詢SQL應該只能查詢出一條記錄 public static void GenParameterData(System.Web.UI.Page DataPage, string ParameterQuerySQL) { GenOneRecordset(DataPage, ParameterQuerySQL); } //根據RecordsetQuerySQL獲取報表明細數據,對應數據加載到報表的明細網格的記錄集中 //根據ParameterQuerySQL獲取報表參數數據,對應數據加載到報表參數、非明細網格中的部件框中 public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL, ResponseDataType DataType) { ArrayList QueryList = new ArrayList(); QueryList.Add(new ReportQueryItem(RecordsetQuerySQL, "Detail")); QueryList.Add(new ReportQueryItem(ParameterQuerySQL, "Master")); GenMultiRecordset(DataPage, QueryList); } public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL) { GenEntireData(DataPage, RecordsetQuerySQL, ParameterQuerySQL, ReportDataBase.DefaultDataType); } //>>保留前面版本的函數,兼容以前版本所寫程序 } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class SqlJsonReportData 根據SQL產生報表需要的 JSON 數據,采用 Sql 數據引擎 public class SqlJsonReportData : SqlReportData { public static void GenOneRecordset(System.Web.UI.Page DataPage, string QuerySQL) { SqlReportData.DoGenDetailData(DataPage, QuerySQL, ReportDataBase.DefaultDataType, true); } public static void GenMultiRecordset(System.Web.UI.Page DataPage, ArrayList QueryList) { SqlConnection ReportConn = new SqlConnection(SqlConnStr); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); foreach (ReportQueryItem item in QueryList) { SqlDataAdapter DataAdapter = new SqlDataAdapter(item.QuerySQL, ReportConn); DataAdapter.Fill(ReportDataSet, item.RecordsetName); } ReportConn.Close(); JSONReportData.GenDataSet(DataPage, ReportDataSet, ReportDataBase.DefaultDataType); } //特別提示:以下函數為兼容以前版本而保留,請勿再用之,無須兼容考慮可刪除之 //<<保留前面版本的函數,兼容以前版本所寫程序 //產生報表明細記錄數據,數據將被加載到明細網格的記錄集中 public static void GenDetailData(System.Web.UI.Page DataPage, string QuerySQL) { GenOneRecordset(DataPage, QuerySQL); } //這里只產生報表參數數據,數據將加載到報表參數、非明細網格中的部件框中 //當報表沒有明細時,調用本方法生成數據,查詢SQL應該只能查詢出一條記錄 public static void GenParameterData(System.Web.UI.Page DataPage, string ParameterQuerySQL) { GenOneRecordset(DataPage, ParameterQuerySQL); } //根據RecordsetQuerySQL獲取報表明細數據,對應數據加載到報表的明細網格的記錄集中 //根據ParameterQuerySQL獲取報表參數數據,對應數據加載到報表參數、非明細網格中的部件框中 public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL, ResponseDataType DataType) { ArrayList QueryList = new ArrayList(); QueryList.Add(new ReportQueryItem(RecordsetQuerySQL, "Detail")); QueryList.Add(new ReportQueryItem(ParameterQuerySQL, "Master")); GenMultiRecordset(DataPage, QueryList); } public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL) { GenEntireData(DataPage, RecordsetQuerySQL, ParameterQuerySQL, ReportDataBase.DefaultDataType); } //>>保留前面版本的函數,兼容以前版本所寫程序 } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class OledbReportData 產生提供給報表生成需要的 XML 或 JSON 數據,采用 OleDb 數據引擎 public class OledbReportData { //★特別提示★: //連接Grid++Report Access例子數據庫的連接串,應該修改為與實際一致,如果安裝目錄不在C:\Grid++Report 5.0,應進行修改。 public const string OleDbConnStr = @"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\Grid++Report 6\Samples\Data\Northwind.mdb"; //定義在SQL中表示日期值的包圍符號,Access用“#”, 而MS SQl Server用“'”,為了生成兩者都可用的查詢SQL語句,將其參數化定義出來。這樣處理只是為了演示例子方便 public const char DateSqlBracketChar = '#'; //根據查詢SQL,產生提供給報表生成需要的 XML 數據,字段值為空也產生數據 public static void FullGenNodeXmlData(System.Web.UI.Page DataPage, string QuerySQL, bool ToCompress) { OleDbConnection ReportConn = new OleDbConnection(OleDbConnStr); OleDbCommand ReportDataCommand = new OleDbCommand(QuerySQL, ReportConn); ReportConn.Open(); OleDbDataReader ReportDataReader = ReportDataCommand.ExecuteReader(); XMLReportData.GenNodeXmlDataFromReader(DataPage, ReportDataReader, ToCompress ? ResponseDataType.ZipBinary : ResponseDataType.PlainText); ReportDataReader.Close(); ReportConn.Close(); } //獲取 Count(*) SQL 查詢到的數據行數。參數 QuerySQL 指定獲取報表數據的查詢SQL public static int BatchGetDataCount(string QuerySQL) { int Total = 0; OleDbConnection ReportConn = new OleDbConnection(OleDbConnStr); OleDbCommand ReportDataCommand = new OleDbCommand(QuerySQL, ReportConn); ReportConn.Open(); OleDbDataReader ReportDataReader = ReportDataCommand.ExecuteReader(); if (ReportDataReader.Read()) Total = ReportDataReader.GetInt32(0); ReportDataReader.Close(); ReportConn.Close(); return Total; } //<<protected function //根據查詢SQL,產生提供給報表生成需要的 XML 或 JSON 數據 protected static void DoGenDetailData(System.Web.UI.Page DataPage, string QuerySQL, ResponseDataType DataType, bool IsJSON) { OleDbConnection ReportConn = new OleDbConnection(OleDbConnStr); OleDbDataAdapter ReportDataAdapter = new OleDbDataAdapter(QuerySQL, ReportConn); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); ReportDataAdapter.Fill(ReportDataSet); ReportConn.Close(); if (IsJSON) JSONReportData.GenDataSet(DataPage, ReportDataSet, DataType); else XMLReportData.GenDataSet(DataPage, ReportDataSet, DataType); } //>>protected function //特別提示:以下函數為兼容以前版本而保留,請勿再用之,無須兼容考慮可刪除之 //<<保留前面版本的函數,兼容以前版本所寫程序 //根據查詢SQL,產生提供給報表生成需要的 XML 數據,采用 OleDb 數據引擎 public static void GenNodeXmlData(System.Web.UI.Page DataPage, string QuerySQL, bool ToCompress) { DoGenDetailData(DataPage, QuerySQL, ToCompress ? ResponseDataType.ZipBinary : ResponseDataType.PlainText, false); } //根據查詢SQL,產生提供給報表生成需要的 XML 數據,采用 OleDb 數據引擎, 這里只產生報表參數數據 //當報表沒有明細時,調用本方法生成數據,查詢SQL應該只能查詢出一條記錄 public static void GenParameterReportData(System.Web.UI.Page DataPage, string ParameterQuerySQL) { DoGenDetailData(DataPage, ParameterQuerySQL, ResponseDataType.PlainText, false); } //根據查詢SQL,產生提供給報表生成需要的 XML 數據,采用 OleDb 數據引擎, 根據RecordsetQuerySQL獲取報表明細數據,根據ParameterQuerySQL獲取報表參數數據 public static void GenEntireReportData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL, bool ToCompress) { OleDbConnection ReportConn = new OleDbConnection(OleDbConnStr); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); OleDbDataAdapter DataAdapter1 = new OleDbDataAdapter(RecordsetQuerySQL, ReportConn); DataAdapter1.Fill(ReportDataSet, "Detail"); OleDbDataAdapter DataAdapter2 = new OleDbDataAdapter(ParameterQuerySQL, ReportConn); DataAdapter2.Fill(ReportDataSet, "Master"); ReportConn.Close(); XMLReportData.GenDataSet(DataPage, ReportDataSet, ReportDataBase.DefaultDataType); } //>>保留前面版本的函數,兼容以前版本所寫程序 } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class OledbXMLReportData 根據SQL產生報表需要的 XML 數據,采用 OleDb 數據引擎 public class OledbXMLReportData : OledbReportData { public static void GenOneRecordset(System.Web.UI.Page DataPage, string QuerySQL) { OledbReportData.DoGenDetailData(DataPage, QuerySQL, ReportDataBase.DefaultDataType, false); } public static void GenMultiRecordset(System.Web.UI.Page DataPage, ArrayList QueryList) { OleDbConnection ReportConn = new OleDbConnection(OleDbConnStr); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); foreach (ReportQueryItem item in QueryList) { OleDbDataAdapter DataAdapter = new OleDbDataAdapter(item.QuerySQL, ReportConn); DataAdapter.Fill(ReportDataSet, item.RecordsetName); } ReportConn.Close(); XMLReportData.GenDataSet(DataPage, ReportDataSet, ReportDataBase.DefaultDataType); } //特別提示:以下函數為兼容以前版本而保留,請勿再用之,無須兼容考慮可刪除之 //<<保留前面版本的函數,兼容以前版本所寫程序 //產生報表明細記錄數據,數據將被加載到明細網格的記錄集中 public static void GenDetailData(System.Web.UI.Page DataPage, string QuerySQL) { GenOneRecordset(DataPage, QuerySQL); } //這里只產生報表參數數據,數據加載到報表參數、非明細網格中的部件框中 //當報表沒有明細時,調用本方法生成數據,查詢SQL應該只能查詢出一條記錄 public static void GenParameterData(System.Web.UI.Page DataPage, string ParameterQuerySQL) { GenOneRecordset(DataPage, ParameterQuerySQL); } //根據RecordsetQuerySQL獲取報表明細數據,對應數據加載到報表的明細網格的記錄集中 //根據ParameterQuerySQL獲取報表參數數據,對應數據加載到報表參數、非明細網格中的部件框中 public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL, ResponseDataType DataType) { ArrayList QueryList = new ArrayList(); QueryList.Add(new ReportQueryItem(RecordsetQuerySQL, "Detail")); QueryList.Add(new ReportQueryItem(ParameterQuerySQL, "Master")); GenMultiRecordset(DataPage, QueryList); } public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL) { GenEntireData(DataPage, RecordsetQuerySQL, ParameterQuerySQL, ReportDataBase.DefaultDataType); } //>>保留前面版本的函數,兼容以前版本所寫程序 } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //class OledbJsonReportData 根據SQL產生報表需要的 JSON 數據,采用 OleDb 數據引擎 public class OledbJsonReportData : OledbReportData { public static void GenOneRecordset(System.Web.UI.Page DataPage, string QuerySQL) { OledbReportData.DoGenDetailData(DataPage, QuerySQL, ReportDataBase.DefaultDataType, true); } public static void GenMultiRecordset(System.Web.UI.Page DataPage, ArrayList QueryList) { OleDbConnection ReportConn = new OleDbConnection(OleDbConnStr); DataSet ReportDataSet = new DataSet(); ReportConn.Open(); foreach (ReportQueryItem item in QueryList) { OleDbDataAdapter DataAdapter = new OleDbDataAdapter(item.QuerySQL, ReportConn); DataAdapter.Fill(ReportDataSet, item.RecordsetName); } ReportConn.Close(); JSONReportData.GenDataSet(DataPage, ReportDataSet, ReportDataBase.DefaultDataType); } //特別提示:以下函數為兼容以前版本而保留,請勿再用之,無須兼容考慮可刪除之 //<<保留前面版本的函數,兼容以前版本所寫程序 //產生報表明細記錄數據,數據將被加載到明細網格的記錄集中 public static void GenDetailData(System.Web.UI.Page DataPage, string QuerySQL) { GenOneRecordset(DataPage, QuerySQL); } //這里只產生報表參數數據,數據將加載到報表參數、非明細網格中的部件框中 //當報表沒有明細時,調用本方法生成數據,查詢SQL應該只能查詢出一條記錄 public static void GenParameterData(System.Web.UI.Page DataPage, string ParameterQuerySQL) { GenOneRecordset(DataPage, ParameterQuerySQL); } //根據RecordsetQuerySQL獲取報表明細數據,對應數據加載到報表的明細網格的記錄集中 //根據ParameterQuerySQL獲取報表參數數據,對應數據加載到報表參數、非明細網格中的部件框中 public static void GenEntireData(System.Web.UI.Page DataPage, string RecordsetQuerySQL, string ParameterQuerySQL) { ArrayList QueryList = new ArrayList(); QueryList.Add(new ReportQueryItem(RecordsetQuerySQL, "Detail")); QueryList.Add(new ReportQueryItem(ParameterQuerySQL, "Master")); GenMultiRecordset(DataPage, QueryList); } //>>保留前面版本的函數,兼容以前版本所寫程序 } }
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>PrintReport</title> <script src="~/Areas/Admin/Content/js/CreateControl.js"></script> <script type="text/javascript"> CreateReport("Report"); //在網頁初始加載時向報表提供數據 function window_onload() { Report.LoadFromURL("/grf/PurchaseOrder.grf"); } function btnPreview_onclick() { Report.LoadDataFromURL("/data/PurchaseOrder.aspx?id=33"); Report.PrintPreview(true); } </script> </head> <body onload="window_onload()"> <p> <input id="btnPreview" onclick="return btnPreview_onclick()" type="button" value="打印預覽" /> </p> </body> </html>
public partial class PurchaseOrder : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string id = this.Request["id"]; SqlXMLReportData.GenOneRecordset(this, "select * from PurchaseOrderTB"); } }

開放grf文件訪問權限

