通过存储过程实现报表复杂查询并以Excel格式输出
2008-11-11 10:55
555 查看
本模块实现功能:用户自定义投诉报表查询并以Excel格式输出。
用户所自定义的查询条件有地点,县市,乡镇,网络(GSM,CDMA),日期以及查询类型,分别由以下变量纪录:
1
string address,city,town;
2
int netid;
3
string dateString1,dateString2;
4
int queryStyle=0;
5
address=TextBox1.Text.ToString().Trim();
6
city=TextBox2.Text.ToString().Trim();
7
town=TextBox3.Text.ToString().Trim();
8
netid=DropDownList1.SelectedIndex-1;
9
dateString1=this.date1.Text.ToString().Trim();
10
dateString2=this.date2.Text.ToString().Trim();
11
if(RadioButton2.Checked==true)
12
queryStyle=1;接着把这些参数传给存储过程sp_customReport,存储过程根据参数的不同值选择不同的查询,sql server中存储过程的代码:
1
CREATE procedure sp_customReport
2
@address varchar(100),@city varchar(20),@town varchar(20),
3
@netid int,@queryStyle int,
4
@datestring1 varchar(20),@datestring2 varchar(20)
5
as
6
declare @sqlstring varchar(700)
7
if @queryStyle=0
8
begin
9
select @sqlstring='select ad.messageid as 编号,ad.address as 地点,ad.city as 县市,ad.town as 乡镇,ad.netid as 网络,cast(ad.netinfo as varchar) as 现网情况,cast(ad.explain as varchar) as 处理情况,cast(ad.appended as varchar) as 备注,count(ap.addtime) as 投诉次数 from address as ad inner join addpoint as ap on ad.messageid=ap.messageid where ad.address like '''
10
+'%'+@address+'%'+''' and ad.city like '''+'%'+@city+'%'+'''and ad.town like '''+'%'+@town+'%'''
11
if @netid!=-1
12
select @sqlstring=@sqlstring+' and ad.netid='+str(@netid)
13
select @sqlstring=@sqlstring+' and ap.addtime between '''+convert(varchar(10),@datestring1,120)+''' and '''+convert(varchar(10),dateadd(day,1,@datestring2),120)
14
+''' group by ad.messageid,ad.address,ad.city,ad.town,ad.netid,cast(ad.netinfo as varchar),cast(ad.explain as varchar),cast(ad.appended as varchar)'
15
end
16
else
17
18
begin
19
select @sqlstring='select ad.messageid as 编号,ad.address as 地点,ad.city as 县市,ad.town as 乡镇,ad.netid as 网络,ad.netinfo as 现网情况,ad.explain as 处理情况,ad.appended as 备注,ap.addtime as 投诉时间 from address as ad inner join addpoint as ap on ad.messageid=ap.messageid where ad.address like '''
20
+'%'+@address+'%'+''' and ad.city like '''+'%'+@city+'%'+'''and ad.town like '''+'%'+@town+'%'''
21
if @netid!=-1
22
select @sqlstring=@sqlstring+' and ad.netid='+str(@netid)
23
select @sqlstring=@sqlstring+' and ap.addtime between '''+convert(varchar(10),@datestring1,120)+''' and '''+convert(varchar(10),dateadd(day,1,@datestring2),120)+''''
24
end
25
exec(@sqlstring)
26
27
GO
28
需要注意的是:1,ntext,text类型字段不可以进行分组查询,需要用cast()进行格式转化;2,同一功能的查询尽量写在同一个存储过程中,比通过C#进行条件分类判断再调用几个存储过程清晰。
这样,编写ASP.NET代码时就编得清晰多了,不需要进行任何条件判断,直接把页面取得的参数传给存储过程执行就OK了:
1
try
2
{
3
//SqlConnection myConnection = new SqlConnection("server=aaron;database=dms;uid=sa;pwd=116596");
4
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["MyConn"].ToString().Trim());
5
SqlCommand mycommand = new SqlCommand("sp_customReport", myConnection);
6
mycommand.CommandType = CommandType.StoredProcedure;
7
mycommand.Connection=myConnection;
8
mycommand.Parameters.Add("@address", SqlDbType.Char);
9
mycommand.Parameters["@address"].Value = address;
10
mycommand.Parameters.Add("@city", SqlDbType.Char);
11
mycommand.Parameters["@city"].Value = city;
12
mycommand.Parameters.Add("@town", SqlDbType.Char);
13
mycommand.Parameters["@town"].Value = town;
14
mycommand.Parameters.Add("@netid", SqlDbType.Int);
15
mycommand.Parameters["@netid"].Value = netid;
16
mycommand.Parameters.Add("@datestring1", SqlDbType.Char);
17
mycommand.Parameters["@datestring1"].Value = dateString1;
18
mycommand.Parameters.Add("@datestring2", SqlDbType.Char);
19
mycommand.Parameters["@datestring2"].Value = dateString2;
20
mycommand.Parameters.Add("@queryStyle", SqlDbType.Int);
21
mycommand.Parameters["@queryStyle"].Value = queryStyle;
22
DataSet ds=new DataSet();
23
//mycommand(ds,"new");
24
SqlDataAdapter sqla=new SqlDataAdapter();
25
sqla.SelectCommand=mycommand;
26
sqla.Fill(ds);
27
//myConnection.Open();
28
//SqlDataReader result = mycommand.ExecuteReader();
29
//MyDataGrid.DataSource=result;
30
MyDataGrid.DataSource=ds.Tables[0];
31
MyDataGrid.DataBind();
32
myConnection.Close();
33
}
34
catch(SqlException er)
35
{
36
Label7.Text="Exception in main:"+er.Message;
37
return;
38
}
在DataGrid中得到数据后,用户可以Excel的格式下载得到查询后的文件,代码比较简单:
private void Button2_Click(object sender, System.EventArgs e)
{
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "result.xls");
Response.Charset = "";
this.EnableViewState = false ;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new HtmlTextWriter(tw);
MyDataGrid.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();
}至此该页面功能实现完毕。
用户所自定义的查询条件有地点,县市,乡镇,网络(GSM,CDMA),日期以及查询类型,分别由以下变量纪录:
1
string address,city,town;
2
int netid;
3
string dateString1,dateString2;
4
int queryStyle=0;
5
address=TextBox1.Text.ToString().Trim();
6
city=TextBox2.Text.ToString().Trim();
7
town=TextBox3.Text.ToString().Trim();
8
netid=DropDownList1.SelectedIndex-1;
9
dateString1=this.date1.Text.ToString().Trim();
10
dateString2=this.date2.Text.ToString().Trim();
11
if(RadioButton2.Checked==true)
12
queryStyle=1;接着把这些参数传给存储过程sp_customReport,存储过程根据参数的不同值选择不同的查询,sql server中存储过程的代码:
1
CREATE procedure sp_customReport
2
@address varchar(100),@city varchar(20),@town varchar(20),
3
@netid int,@queryStyle int,
4
@datestring1 varchar(20),@datestring2 varchar(20)
5
as
6
declare @sqlstring varchar(700)
7
if @queryStyle=0
8
begin
9
select @sqlstring='select ad.messageid as 编号,ad.address as 地点,ad.city as 县市,ad.town as 乡镇,ad.netid as 网络,cast(ad.netinfo as varchar) as 现网情况,cast(ad.explain as varchar) as 处理情况,cast(ad.appended as varchar) as 备注,count(ap.addtime) as 投诉次数 from address as ad inner join addpoint as ap on ad.messageid=ap.messageid where ad.address like '''
10
+'%'+@address+'%'+''' and ad.city like '''+'%'+@city+'%'+'''and ad.town like '''+'%'+@town+'%'''
11
if @netid!=-1
12
select @sqlstring=@sqlstring+' and ad.netid='+str(@netid)
13
select @sqlstring=@sqlstring+' and ap.addtime between '''+convert(varchar(10),@datestring1,120)+''' and '''+convert(varchar(10),dateadd(day,1,@datestring2),120)
14
+''' group by ad.messageid,ad.address,ad.city,ad.town,ad.netid,cast(ad.netinfo as varchar),cast(ad.explain as varchar),cast(ad.appended as varchar)'
15
end
16
else
17
18
begin
19
select @sqlstring='select ad.messageid as 编号,ad.address as 地点,ad.city as 县市,ad.town as 乡镇,ad.netid as 网络,ad.netinfo as 现网情况,ad.explain as 处理情况,ad.appended as 备注,ap.addtime as 投诉时间 from address as ad inner join addpoint as ap on ad.messageid=ap.messageid where ad.address like '''
20
+'%'+@address+'%'+''' and ad.city like '''+'%'+@city+'%'+'''and ad.town like '''+'%'+@town+'%'''
21
if @netid!=-1
22
select @sqlstring=@sqlstring+' and ad.netid='+str(@netid)
23
select @sqlstring=@sqlstring+' and ap.addtime between '''+convert(varchar(10),@datestring1,120)+''' and '''+convert(varchar(10),dateadd(day,1,@datestring2),120)+''''
24
end
25
exec(@sqlstring)
26
27
GO
28
需要注意的是:1,ntext,text类型字段不可以进行分组查询,需要用cast()进行格式转化;2,同一功能的查询尽量写在同一个存储过程中,比通过C#进行条件分类判断再调用几个存储过程清晰。
这样,编写ASP.NET代码时就编得清晰多了,不需要进行任何条件判断,直接把页面取得的参数传给存储过程执行就OK了:
1
try
2
{
3
//SqlConnection myConnection = new SqlConnection("server=aaron;database=dms;uid=sa;pwd=116596");
4
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["MyConn"].ToString().Trim());
5
SqlCommand mycommand = new SqlCommand("sp_customReport", myConnection);
6
mycommand.CommandType = CommandType.StoredProcedure;
7
mycommand.Connection=myConnection;
8
mycommand.Parameters.Add("@address", SqlDbType.Char);
9
mycommand.Parameters["@address"].Value = address;
10
mycommand.Parameters.Add("@city", SqlDbType.Char);
11
mycommand.Parameters["@city"].Value = city;
12
mycommand.Parameters.Add("@town", SqlDbType.Char);
13
mycommand.Parameters["@town"].Value = town;
14
mycommand.Parameters.Add("@netid", SqlDbType.Int);
15
mycommand.Parameters["@netid"].Value = netid;
16
mycommand.Parameters.Add("@datestring1", SqlDbType.Char);
17
mycommand.Parameters["@datestring1"].Value = dateString1;
18
mycommand.Parameters.Add("@datestring2", SqlDbType.Char);
19
mycommand.Parameters["@datestring2"].Value = dateString2;
20
mycommand.Parameters.Add("@queryStyle", SqlDbType.Int);
21
mycommand.Parameters["@queryStyle"].Value = queryStyle;
22
DataSet ds=new DataSet();
23
//mycommand(ds,"new");
24
SqlDataAdapter sqla=new SqlDataAdapter();
25
sqla.SelectCommand=mycommand;
26
sqla.Fill(ds);
27
//myConnection.Open();
28
//SqlDataReader result = mycommand.ExecuteReader();
29
//MyDataGrid.DataSource=result;
30
MyDataGrid.DataSource=ds.Tables[0];
31
MyDataGrid.DataBind();
32
myConnection.Close();
33
}
34
catch(SqlException er)
35
{
36
Label7.Text="Exception in main:"+er.Message;
37
return;
38
}
在DataGrid中得到数据后,用户可以Excel的格式下载得到查询后的文件,代码比较简单:
private void Button2_Click(object sender, System.EventArgs e)
{
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "result.xls");
Response.Charset = "";
this.EnableViewState = false ;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new HtmlTextWriter(tw);
MyDataGrid.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();
}至此该页面功能实现完毕。
相关文章推荐
- 通过存储过程实现报表复杂查询并以Excel格式输出
- delphi 用别名的方式访问excel写入数据,实现非标格式报表输出
- EasyUI入门9 EasyUI+NPOI+QrCode实现带二维码复杂格式excel文件导出
- 水晶报表导出为pdf, word , excel 格式(已经测试过,实现了该功能)
- EBS中RTF报表Excel格式输出字段长度不正确的解决办法
- 完整的thinphp+phpexcel实现excel报表的输出(有图有效果)
- 完整的thinphp+phpexcel实现excel报表的输出(有图有效果)
- 微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表
- 使用jsp实现word、excel格式报表打印
- 水晶报表导出为pdf, word , excel 格式(已经测试过,实现了该功能)
- EBS中 EXCEL 格式报表输出的公用API
- 原创:如何实现在Excel通过循环语句设置指定行的格式
- 通过生成PSR文件,实现动态报表格式
- 通过elasticsearch-api实现更复杂的查询
- 使用Visual FoxPro 8.0的成员类和Excel实现自定义报表输出
- POI实现Excel报表,实现下载、图片输出、字体设置
- 使用JSP实现WORD、EXCEL格式报表打印
- Android实现OCR文字识别并且转换为Excel、PDF格式输出
- sqlplus输出html或者excel格式报表
- JAVA将Excel中的报表导出为图片格式(二)实现思路