在C#2005中如何实现数据库中交叉表的功能

来源 :电脑知识与技术·学术交流 | 被引量 : 0次 | 上传用户:gygc126
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:交叉表的设计一直是程序开发的难点,充分利用C#2005数据集和数据表的离线功能,我们可以把一张表的数据行变成另一个内存表的数据列,这样我们就可以非常容易地进行数据汇总统计,统计要求符合中国报表特色。
  关键词:离线模式;数据集;数据表;交叉表
  中图法分类号:TP31 文献标识码:B 文章编号:1009-3044(2008)15-20ppp-0c
  
  Implement CrossTable in C#2005
  PANG Yi-fan
  (WuXi High Vocational Education,Wuxi 214028,China)
  Abstract:Cross-table design has been developed and difficult process,full use of C# 2005 dataset and datatable’s offline function,we can transform datarows of one table into another datacolumns of memory table,so that we can be very easy data summary statistics, the statistical requirements in line with China’s statements characteristics.
  Key words:OffLine;DataSet;DataTable;CrossTable
  
  1 ADO.Net下的离线模式
  
  我们知道在C#2005中进行数据库开发的时候,需要利用ADO.Net技术进行开发,在ADO.Net之前,一般开发数据库程序的时候,都需要在线访问数据库服务器中的数据,也就是说客户端程序在运行的时候,都和远程的数据库服务器连接,直到关闭你的运行程序为止。这一种联机方式在局域网内没有什么问题,但是在今天以互联网为基础的环境下,就存在很大的弊端,主要原因就是客户连接到数据库是一种比较耗内存的资源,当有大量用户访问数据库服务器,服务器就会占据大量的内存,并且网络的传输效率会降低。为此ADO.Net提出了离线模式,就是为克服在线模式下的缺点而设计的,解决方法就是当用户需要数据的时候,连接数据库服务器,当数据下载到客户端的时候,马上断开与数据库服务器的连接,这样就节省了大量的资源。离线模式的技术解决之道用数据集来表示(DataSet),一个数据集可以存放任意数量的数据表(DataTable),而每一个DataTable之间还可以建立关系(TableRelation),有了这样的概念以后,我们可以认为一个DataSet就是一个数据库在客户端的副本。具体模式图表如下:
  
  课程表内容如下:
  
  从成绩表我们可以查出任何一个人的每一门课程的成绩,但是如果要统计全班所有课程就比较困难;这时我们必须用到交叉表,但是交叉表在数据库中没有定义,编程人员必须利用ADO.Net技术在内存中动态生成如下的表格(成绩汇总表):
  
  2.2 用C#2005创建动态表
  (1)创建一个过程(CreateTable)来建立需要的表
  private void CreateTable()
  {Settings st = new Settings();
  conn = new SqlConnection(st.Setting);//建立数据库连接
  conn.Open();
  dap = new SqlDataAdapter("select sno,sname from stu", conn);
  dt = new DataTable("学生表");
  ds = new DataSet();
  dap.Fill(ds, "学生表");//内存中建立学生表,具有字段学号和姓名
  dap = new SqlDataAdapter("select coursename from courseName ", conn);
  dt = new DataTable("课程名称");
  dap.Fill(ds, "课程名称");//建立课程表,只有字段课程名称
  dt = new DataTable("分数表");
  ds.Tables.Add("分数表");
  
   //以下是动态的建立成绩汇总表,而不是用适配器来自动建立内存表,这时建立交叉表的关键
  DataTabledt1 = new DataTable("成绩汇总表");
  ds.Tables.Add("成绩汇总表");
  ds.Tables["成绩汇总表"].Columns.Add("sno", typeof(System.String));
  ds.Tables["成绩汇总表"].Columns["sno"].MaxLength = 6;
  ds.Tables["成绩汇总表"].Columns.Add("sname", typeof(System.String));
  ds.Tables["成绩汇总表"].Columns["sname"].MaxLength = 10;
  string Express = string.Empty;
  int count = ds.Tables["课程名称"].Rows.Count;
  foreach (DataRow dr in ds.Tables["课程名称"].Rows)
  {
  ds.Tables["成绩汇总表"].Columns.Add((string)dr["coursename"], typeof(System.Double));
  ds.Tables["成绩汇总表"].Columns[(string)dr["coursename"]].DefaultValue = 0;
  Express = (string)dr["coursename"] " ";
  }
  Express = Express.Substring(0, Express.Length - 1);
  //建立计算字段
  ds.Tables["成绩汇总表"].Columns.Add("总分", typeof(System.Double));
  ds.Tables["成绩汇总表"].Columns["总分"].Expression = Express;
  ds.Tables["成绩汇总表"].Columns.Add("平均分", typeof(System.Double));
  ds.Tables["成绩汇总表"].Columns["平均分"].Expression = "总分/" count.ToString();
  DataColumn[] dc = new DataColumn[1];
  dc[0] = ds.Tables["成绩汇总表"].Columns["sno"];
  ds.Tables["成绩汇总表"].PrimaryKey = dc;//建立主关键字
  
  //加数据
  foreach (DataRow dr in ds.Tables["课程名称"].Rows)
  {
  //3表中找出每门课程对应的所有信息学号,姓名,课程号,课程名,分数
  SqlDataAdapter dapFen = new SqlDataAdapter("select a.sno,a.sname,b.coursename,c.courseid,c.fen from stu a,course b,Score c where a.sno=c.sno and b.courseid=c.courseid and b.coursename=’" dr["coursename"].ToString() "’", conn);
  ds.Tables["分数表"].Rows.Clear();
  dapFen.Fill(ds, "分数表");//建立分数表,(数学,物理,化学,语文)
  foreach (DataRow drr in ds.Tables["分数表"].Rows)
  {
  DataRow drfind = ds.Tables["成绩汇总表"].Rows.Find(drr["sno"]);
  if (drfind == null)//汇总表中没有相应的课程记录就添加
  {
  DataRow drd = ds.Tables["成绩汇总表"].NewRow();
  drd["sno"] = drr["sno"];
  drd["sname"] = drr["sname"];
  drd[(string)dr["coursename"]] = drr["fen"];//课程名对应相应的成绩
  ds.Tables["成绩汇总表"].Rows.Add(drd);
  }
  else//有记录就修改其分数
  {
  //找到的记录所在的行位置
  int i = ds.Tables["成绩汇总表"].Rows.IndexOf(drfind);ds.Tables["成绩汇总表"].Rows[i][(string)dr["coursename"]] = drr["fen"];
  }
  }
  }
  
  conn.Close();//断开连接,进入离线模式
  }
  (2)建立过程CreteField来建立DataGridView的列和内存表(成绩汇总表的绑定关系)
  private void CreateField()
  {
  Grid.Columns.Add("c1", "学号");
  Grid.Columns["c1"].DataPropertyName = "sno"; //数据绑定
  Grid.Columns["c1"].Width = 75;
  Grid.Columns["c1"].Frozen = true;//冻结列
  Grid.Columns.Add("c2", "姓名");
  Grid.Columns["c2"].DataPropertyName = "sname";
  Grid.Columns["c2"].Width = 65;
  Grid.Columns["c2"].Frozen = true;
  int i = 3;
  foreach (DataRow dr in ds.Tables["课程名称"].Rows)
  {
  Grid.Columns.Add("c" i.ToString(), (string)dr["coursename"]);
  Grid.Columns["c" i.ToString()].DataPropertyName = (string)dr["coursename"];
  Grid.Columns["c" i.ToString()].Width = 80;
  i ;
  }
  Grid.Columns.Add("总分", "总分");
  Grid.Columns["总分"].DataPropertyName = "总分";
  Grid.Columns["总分"].Width = 80;
  
  Grid.Columns.Add("平均分", "平均分");
  Grid.Columns["平均分"].DataPropertyName = "平均分";
  Grid.Columns["平均分"].Width = 80;
  Grid.DataSource = ds.Tables["成绩汇总表"];
  
  (3)我们只需要在窗体的OnLoad事件中调用上面定义的两个过程即可,具体代码如下:
  
  public partial class FrmHZ : Form
  { SqlConnection conn;
  SqlDataAdapter dap;
  DataSet ds;
  DataTable dt;
   string SQLStr = string.Empty;
   //以上定义的窗体级成员
  
   public FrmHZ()
   {
  InitializeComponent();
   }
  
   private void FrmHZ_Load(object sender, EventArgs e)
   {
   CreateTable();
   CreateField();
   }
  }
  
  3 结束语
  
  交叉表在数据统计中占有比较重要的地位,但是数据表中并不存在交叉表,所以需要我们根据现成的表来动态建立内存中的交叉表。利用DataTable对象中Columns集合来动态建立交叉表的数据列,而该数据列来自数据表Course的行内容。(当我们在课程表中加上一门新的课程的时候,交叉表中的内容会自动变化)
  
  参考文献:
  [1]黄忠成.Framework的设计与应用[M].北京:电子工业出版社,2006年1月,90-165.
  [2]ADO.Net高级编程[M] (美)Glenn Johnson 北京:清华大学出版社,2006年6月50-198.
  [3]代方震.Visual C# 2005程序设计.北京:人民邮电出版社,2007年9月,206-243.
  
  收稿日期:2008-2-18
  作者简介:庞一凡(1965-),江苏无锡人,无锡机电高等职业技术学校信息系教师,软件工程师,研究方向:计算机软件开发(C#.Net,Delphi 和SQL Server下的网络数据库程序开发)。
其他文献
关键词:医院 人力资源外包 优势 不足  目前,我国市场经济不断发展,医疗改革也在持续进行,医院面临的竞争环境日趋激烈,巨大的成本压力迫使医院不断进行资源整合、流程改造、职能外包等管理模式创新,力求降低成本,提升竞争力。人力资源外包正是在这样的背景下出现的一种人力资源管理模式,其能够降低医院成本,提高经营效率,提升医院核心竞争力。因此,人力资源外包的管理模式越来越被医院管理者所认可和接受。一、人力
关键词:上市公司 会计稳健性 财务不端一、引言  在会计信息质量方面的研究中,对会计稳健性的探究成为大家的关注重点。会计稳健性又称之为谨慎性原则,是会计理论的基本原则之一。基本会计准则对会计稳健性是这样规定的,即企业在经济业务活动的确认、计量和报告过程中,不应该高估资产或者收益、低估负债或者成本费用。二、假设的提出  本文提出如下的基本假设:  假设:会计稳健性与财务不端呈显著的负相关关系。三、样
关键词:乡镇卫生院 固定资产 对策  固定资产是一个单位最基础的物形资源,占到单位资产的主要部分,一个单位如何有效的进行固定资产管理,对于保障单位资产安全完整,以及单位效益提升都具有积极的作用。因此,单位应高度重视资产管理的重要性,从制度制定和制度的全面落实的角度出发,强化单位的固定资产管理,提高固定资产管理的有效性,进而为提升单位的效益打下坚实的基础。当前,我国乡镇卫生院进行全面的改革,其社会效
关键词:信用评级 评级机构监管  经过20多年的发展,我国信用评级机构在规模和服务水平方面均有大幅提升,形成了中诚信国际、东方金诚、中证鹏远等大型评级机构和80多家中小型评级机构并存的机构发展格局。但从地方评级机构来看,大部分地方评级机构不同程度的存在弱、小、多、散的问题。找出现行体制下评级机构存在的问题,巩固评级机构与银行之间的合作关系,对促进地方评级机构发展有很强的现实意义。一、H省信用评级机
关键词:中职会计 信息化教学 原始凭证  原始凭证的认知是会计工作中极为重要的一个内容,在发生经济活动时需要对原始凭证做好填制工作,以此记录业务的实际发生内容,因此在经济活动过程中原始凭证能够作为重要资料,对经济活动中的经济责任进行明确,同时对经济业务中的情况做好直观反映,由此可以看出在会计工作中原始凭证是会计工作中的一个重要基础,对于保证会计信息的真实性以及明确经济活动中的责任等方面具有重要作用
摘 要:由于近年来公安民警伤亡严重,对徒手搏击技能越来越重视,随之而来的就是在搏击技能运动中出现的运动损伤问题,该文就是针对在搏击技能训练中出现的运动损伤进行调查研究,分析在搏击技能运动中损伤的发生及其预防的工作,为的是在今后的警务搏击技能运动训练中能减少运动损伤的发生,从而让学生能够更好地进行训练。  关键词:搏击训练 运动损伤 预防  中图分类号:G8 文献标识码:A 文章编号:2095-28
摘 要:警式体育在司法警官职业类院校所开设课程结构当中起到了核心支撑性作用,既然是体育课程必然会涉及学生的体能、技能的练习。从当前各地区司法警官职业学院警式体育的开设现状来看还有很多欠缺的地方,尤其在专项性的练习方面以及训练设施保障方面的完善,能够为之后学生警务技能的掌握和熟练打下坚实的根基。该次研究通过有针对性地对司法警官职业学院当前现状提出合理的意见和方案,为司法警官类院校的体育教学发展提供理
关键词:高校财务 流程再造 信息化  随着高等教育事业的迅速发展,高校外部环境和内部管理体制都发生了很大变化,传统的高校财务管理模式及运行流程正面临着严峻的考验,财务部门的业务量成倍增加,财务工作人员又面临高校机关精简的压力。为适应形势发展的要求,高校财务部门一方面需要加快推进体制机制改革、加强专业团队建设,通过提升服务质量、精简工作程序、完善内控制度来更好地满足学校教学、科研和各项事业发展的需要
摘要:EDA技术综合了现代电子技术和计算机技术的最新研究成果,其设计采用自顶向下的设计方法,通常采用硬件描述语言进行电子电路设计;VHDL语言以其强大的建模和逻辑综合功能成为EDA技术中应用最广泛的硬件描述语言之一。基于VHDL设计了交通信号灯。  关键词:EDA;自顶向下;VHDL;交通信号灯  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)15-21050-04
摘要:本文介绍了P2P的工作原理及几个典型,着重分析比较了基于超级节点的和基于区域划分结构的两种P2P模型的特性,最后提出自己的观点。  关键词:P2P网络模型;发现机制;区域划分;身份认证   中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)15-2pppp-0c    Comparison and Research of two P2P Network Models