数据库动态数据的处理+Repeater前台动态列的绑定
2014-03-12 22:47
459 查看
问题描述:
如图所示:数据库中有两张表,一张表可以根据课程id选出所有该课程的学生信息,另外一张表可以根据课程id选出该课程所有学生各次考试的成绩。由于考试次数是由老师自己动态设定的,事先并不清楚考试次数到底是多少。(.NET+Oracle网站实现)
1、首先,解决此类问题可以通过Repeater嵌套实现,对于数据量不大的时候可以这么用,但是一旦数据量稍大处理时间会变得很长,效率太差。
2、写个存储过程将所有数据整理成一张表,然后一次绑定到前台控件。
下面是该案例的存储过程:
然后是以下C#语句,读出这张表,放到dataTable中
读出的表结构大致是
xh,c1,c2,c3,c4...等,其中c1,,c2...是动态列,表示的是第几次考试
接下来的问题就是,有一个动态列的表,如何将该表绑定到前台控件中。
前台:
后台:
自此就实现了数据的动态操作了。
如图所示:数据库中有两张表,一张表可以根据课程id选出所有该课程的学生信息,另外一张表可以根据课程id选出该课程所有学生各次考试的成绩。由于考试次数是由老师自己动态设定的,事先并不清楚考试次数到底是多少。(.NET+Oracle网站实现)
1、首先,解决此类问题可以通过Repeater嵌套实现,对于数据量不大的时候可以这么用,但是一旦数据量稍大处理时间会变得很长,效率太差。
2、写个存储过程将所有数据整理成一张表,然后一次绑定到前台控件。
下面是该案例的存储过程:
create or replace procedure sp_get_all_cj(p_xkkh in varchar2, p_cursor out sys_refcursor) is sqlstr varchar2(32767); ct integer; begin sqlstr:='with cjj as ( select a.xh, b.xm, '; for v_cur in (select distinct id, ksmc,ksbh from gcgl.ksxxb where xkkh = p_xkkh order by ksbh ) loop sqlStr := sqlstr || 'sum(case ksid when '''|| v_cur.id ||''' then xscj else null end ) as c'|| v_cur.ksbh ||','; end loop; sqlstr := substr(sqlstr,0,length(sqlstr)-1) ||' from gcgl.xsksb a join gcgl.v_xsb b on a.xh = b.xh ' || 'where exists ( select * from gcgl.ksxxb b where a.ksid = b.id and b.xkkh = ''' || p_xkkh || ''') group by a.xh, b.xm ) ' ; select count(*) into ct from gcgl.xszzcjb where xkkh = p_xkkh; if (ct >0) then--说明已经提交了 sqlstr := sqlstr || ' select rank() over( order by b.xh) rowno, b.*, a.zpcj ' || ' from gcgl.xszzcjb a left join cjj b on a.xh = b.xh ' || ' where a.xkkh = ''' || p_xkkh || ''' order by b.xh'; else sqlstr := sqlstr || ' select rank() over( order by b.xh) rowno, b.*, 0 zpcj ' || ' from cjj b order by b.xh'; end if; open p_cursor for sqlstr; end;
然后是以下C#语句,读出这张表,放到dataTable中
using (OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["JSCJLR"].ToString()))//连接字串 { OleDbCommand myCMD = new OleDbCommand ("{call gcgl.sp_get_all_cj(?, {resultset 0, p_cursor})}", con); myCMD.Parameters.Add("p_xkkh", OleDbType.VarChar, 100).Value = xkkh; OleDbDataAdapter oda = new OleDbDataAdapter(myCMD); DataSet ds = new DataSet(); oda.Fill(ds); dt = ds.Tables[0]; }
读出的表结构大致是
xh,c1,c2,c3,c4...等,其中c1,,c2...是动态列,表示的是第几次考试
接下来的问题就是,有一个动态列的表,如何将该表绑定到前台控件中。
前台:
<table id="table" cellspacing="0" summary="The technical specifications of the Apple PowerMac G5 series"> <caption> </caption> <asp:Repeater runat="server" ID="Repeater" OnItemDataBound=" rptClass1_ItemDataBound"> <headerTemplate> <asp:Literal ID="lit_head" runat="server"></asp:Literal> </headertemplate> <itemtemplate> <asp:Literal ID="lit_item" runat="server"></asp:Literal> </itemtemplate> </asp:Repeater> </table>
后台:
protected void rptClass1_ItemDataBound(object sender, RepeaterItemEventArgs e) { StringBuilder sb = new StringBuilder(); if (e.Item.ItemType == ListItemType.Header) { sb.Append("<tr>"); for (int i = 0; i < dt.Columns.Count; i++) { DataColumn col = dt.Columns[i]; string name = col.ColumnName; switch(col.ColumnName){ case "ROWNO": name = "序号"; break; case "XH": name = "学号"; break; case "XM": name = "姓名"; break; case "ZPCJ": name = "总评成绩"; break; default: string s = col.ColumnName; name = s.Substring(1, s.Length - 1); break; } sb.AppendFormat("<th>{0}</th>",name ); } //foreach (DataColumn col in dt.Columns) //{ // sb.AppendFormat("<th>{0}</th>", col.ColumnName); //} sb.Append("<th>平均分</th><th>最高分</th><th>最低分</th>"); sb.Append("</tr>"); Literal literal = (Literal)e.Item.FindControl("lit_head"); literal.Text = sb.ToString(); } else if (e.Item.ItemType == ListItemType.Item||e.Item.ItemType == ListItemType.AlternatingItem) { int index=e.Item.ItemIndex; sb.Append("<tr rel=''>"); sb.AppendFormat("<td>{0}</td>", index + 1); for (int j = 1; j < 3; j++) { sb.AppendFormat("<td>{0}</td>", dt.Rows[index][j]); } for (int j = 3; j < dt.Columns.Count - 1; j++) { sb.AppendFormat("<td rel='cj'>{0}</td>", dt.Rows[index][j]); } for (int j = dt.Columns.Count - 1; j < dt.Columns.Count; j++) { sb.AppendFormat("<td>{0}</td>", dt.Rows[index][j]); } sb.Append("<td rel=\"pjf\"></td><td rel=\"zgf\"></td><td rel=\"zdf\"></td>"); sb.Append("</tr>"); Literal liter = (Literal)e.Item.FindControl("lit_item"); liter.Text = sb.ToString(); } }
自此就实现了数据的动态操作了。
相关文章推荐
- 如何用XML数据绑定前台Repeater
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
- 《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中
- 使用Using System.Data.OleDb; 连接数据库,又一种动态绑定GridView显示数据。
- 对于分页时,若数据库的数据不断更新,不让前台显示脏数据(同一条数据重复显示)的处理方式
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- Spring MVC处理前台到后台绑定时间格式、doble等数据的解决方式
- spring多数据源的处理 mybatis实现跨库查询 实现Myibatis动态sql跨数据库的处理 Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- Repeater绑定事件ItemDataBound中获取数据库中数据
- 转:c# winform comboBox动态下拉列表,comboBox动态绑定数据库里的数据
- 今天来马克一下把数据库中的数据动态显示到前台页面下拉框中/默认选中
- ajax动态查询数据库数据并显示在前台
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- repeater控件动态数据绑定使用
- viewpager动态绑定数据库数据,并支持动态左右滑动
- ajax动态查询数据库数据并显示在前台的方法
- echart折线图 柱形图 数据格式化 动态绑定数据 frame处理