C程序设计附光盘 宋文强 26962-00chapter11_第1页
C程序设计附光盘 宋文强 26962-00chapter11_第2页
C程序设计附光盘 宋文强 26962-00chapter11_第3页
C程序设计附光盘 宋文强 26962-00chapter11_第4页
C程序设计附光盘 宋文强 26962-00chapter11_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,理解数据库的基本概念,掌握数据绑定的实现方法,熟悉DataGridView、BindingSource等常用数据控件掌握ADO.NET主要对象的属性、方法及编程设置了解SQL的构成和语法,掌握基本数据操纵语句掌握数据库查询和更新(插入、删除、修改)的实现方法,本章教学目标,11.1数据库的基本概念,典型的关系数据库产品AccessSQLServerOracle,11.1.1表与记录,11.1.2表的结构设计,11.2数据绑定,数据绑定(databinding)DataSetBindingSourceDataGridView只需编写少量代码,就可以实现数据库访问,11.2.1设计时与数据控件的绑定,在应用程序界面设计阶段,通过手工操作实现的数据绑定,实例11.1,例11.1利用数据绑定技术,以及DataGridView控件,不编写任何代码,实现数据库内容的查看,操作步骤,操作步骤,操作步骤,操作步骤,操作步骤,操作步骤,自动生成的代码,usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceex11_01publicpartialclassForm1:FormpublicForm1()InitializeComponent();privatevoid学生基本情况表BindingNavigatorSaveItem_Click(objectsender,EventArgse)this.Validate();this.学生基本情况表BindingSource.EndEdit();this.tableAdapterManager.UpdateAll(this.studentDataSet);privatevoidForm1_Load(objectsender,EventArgse)this.学生基本情况表TableAdapter.Fill(this.studentDataSet.学生基本情况表);,自动生成的代码,privatevoid学生基本情况表BindingNavigatorSaveItem_Click(objectsender,EventArgse)this.Validate();this.学生基本情况表BindingSource.EndEdit();this.tableAdapterManager.UpdateAll(this.studentDataSet);privatevoidForm1_Load(objectsender,EventArgse)this.学生基本情况表TableAdapter.Fill(this.studentDataSet.学生基本情况表);,11.2.2设计时与公共控件的绑定,例11.2利用文本框、图片框和标签控件,实现数据库内容的查看、添加、删除、修改和保存,并查看相关联图片,例11.2程序代码,privatevoid学生基本情况表BindingNavigatorSaveItem_Click(objectsender,EventArgse)this.Validate();this.学生基本情况表BindingSource.EndEdit();this.tableAdapterManager.UpdateAll(this.studentDataSet);privatevoidForm1_Load(objectsender,EventArgse)this.学生基本情况表TableAdapter.Fill(this.studentDataSet.学生基本情况表);pictureBox1.Load(images+学号TextBox.Text+.jpg);/加载图片privatevoid照片TextBox_TextChanged(objectsender,EventArgse)pictureBox1.Load(images+学号TextBox.Text+.jpg);/加载图片,11.3ADO.NET,ADO.NET是专门用于数据库连接与访问的类。使用时,必须引用System.Data命名空间,还应根据数据源的类型,选择引用相关的命名空间。,11.3.1ADO.NET的体系结构,1DataProvider(数据提供程序),Connection建立数据源连接;Command生成并执行SQL语句,对数据库进行操作并返回数据DataReader接收由Command对象的ExecuteReader()方法返回的对象,每次只存储结果集当中的一个数据行DataAdapter通过Command对象执行SQL语句,将获得的结果集填充到DataSet对象中;将DataSet更新数据的结果返回到数据库,数据库类型与命名空间引用,Access数据库要求引用System.Data.OleDbSQLServer数据库要求引用System.Data.Sql,2DataSet(数据集),容纳DataProvider传递过来的数据库访问结果把应用程序的执行结果更新到数据库中可以看作是一种驻留在客户端的小型数据库,并与特定的数据库无关。,11.3.2Connection对象,实例11.3,例11.3使用OleDbConnection对象建立与Access数据库student.mdb的连接。如果连接成功,则在消息框中显示“数据库连接已经成功建立”,否则报告错误信息。,实例11.3程序代码,usingSystem.Data.OleDb;/为了连接Access数据库,必须引用此命名空间namespaceex11_03publicpartialclassForm1:FormpublicForm1()InitializeComponent();privatevoidmenuFileOpen_Click(objectsender,EventArgse)stringstr=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;OleDbConnectionconn=newOleDbConnection(str);/创建数据库连接对象并初始化tryconn.Open();/打开数据库连接if(conn.State=ConnectionState.Open)richTextBox1.Text=数据库连接已经成功建立!;catch(Exceptionex)/如果未能成功建立数据库连接,则捕获异常并报告错误信息richTextBox1.Text=ex.Message.ToString();finallyconn.Close();/使用结束后关闭数据库连接,说明,连接Access,必须引用System.Data.OleDb命名空间“Provider=Microsoft.Jet.OLEDB.4.0”意味着数据源为Access数据库“DataSource=student.mdb”指示了数据源路径student.mdb与应用程序可执行文件位于相同目录之下操作数据库的代码均在trycatchfinally结构中,11.3.3Command对象,通过Command对象传递对数据库操作的命令,并返回命令执行的结果,实例11.4,例11.4使用OleDbConnection对象建立与student.mdb的连接,使用OleDbCommand的ExecuteScalar()方法统计“学生基本情况表”中的男生人数。,例11.4代码,privatevoidmenuFileOpen_Click(objectsender,EventArgse)stringstr=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;OleDbConnectionconn=newOleDbConnection(str);/创建数据库连接对象并初始化tryconn.Open();/打开数据库连接if(conn.State=ConnectionState.Open)/如果连接正常建立则执行统计操作OleDbCommandcmd=newOleDbCommand();/创建Command对象cmd.CommandText=selectcount(*)from学生基本情况表where性别=男;cmd.Connection=conn;/OleDbCommandcmd=newOleDbCommand(select*from学生基本情况表,conn);intmycount=(int)cmd.ExecuteScalar();/返回统计结果,转换成所需要的数据类型richTextBox1.Text=男生的人数=+mycount.ToString();catch(Exceptionex)/捕获出错信息并以消息框的形式显示MessageBox.Show(ex.Message,数据库访问);finally/使用结束后关闭数据库连接conn.Close();,核心代码,stringstr=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;OleDbConnectionconn=newOleDbConnection(str);conn.Open();if(conn.State=ConnectionState.Open)OleDbCommandcmd=newOleDbCommand();cmd.CommandText=selectcount(*)from学生基本情况表where性别=男;cmd.Connection=conn;/OleDbCommandcmd=newOleDbCommand(select*from学生基本情况表,conn);intmycount=(int)cmd.ExecuteScalar();richTextBox1.Text=男生的人数=+mycount.ToString();,说明,CommandText属性赋值的字符串是一个SQL语句,统计“学生基本情况表”中男生人数。ExecuteScalar()方法不需要任何参数,它按照CommandText属性所包含的SQL语句执行对指定数据库的操作,返回结果为一个值,而不是一个集合由于事先无法预知返回结果的数据类型,所以返回值为Object类型,引用时需要进行类型转换。,11.3.4DataReader对象,以顺序(forwardonly)、只读(readonly)的方式从数据库中获得数据结果集访问数据库、执行SQL操作时,DataReader要求与数据库始终保持连接在查询数据量不大,并且不需要随机访问和修改数据的场合具有较高的效率,实例11.5,例11.5查看student.mdb中“学生基本情况表”的内容及其字段结构,执行结果显示在RichTextBox中,实例11.5程序代码,OleDbConnectionconn=newOleDbConnection();OleDbCommandcmd=newOleDbCommand();stringstr=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;privatevoidForm1_Load(objectsender,EventArgse)conn.ConnectionString=str;conn.Open();cmd.Connection=conn;cmd.CommandText=Select*from学生基本情况表;,查看数据集内容方法(1),privatevoidmenuBrowsing1_Click(objectsender,EventArgse)richTextBox1.Text=;OleDbDataReaderresult=cmd.ExecuteReader();ObjectdataRow=newObjectresult.FieldCount;while(result.Read()=true)result.GetValues(dataRow);dataRowfor(inti=0;iresult.FieldCount;i+)richTextBox1.Text+=dataRowi+;richTextBox1.Text+=n;result.Close();,查看数据集内容方法(2),privatevoidmenuBrowsing2_Click(objectsender,EventArgse)richTextBox1.Text=;OleDbDataReaderresult=cmd.ExecuteReader();while(result.Read()=true)for(inti=0;iresult.FieldCount;i+)richTextBox1.Text+=resulti+;richTextBox1.Text+=n;result.Close();,查看数据集结构,privatevoidmenuStructure_Click(objectsender,EventArgse)richTextBox1.Text=数据集结构如下:;OleDbDataReaderresult=cmd.ExecuteReader();for(inti=0;i0)MessageBox.Show(表中指定记录修改成功!,记录修改操作);elseMessageBox.Show(未在表中找到要修改的记录!,记录修改失败);,删除记录,privatevoidmenuDelete_Click(objectsender,EventArgse)cmd.CommandText=DeleteFrom学生基本情况表Where学号=2008338018;intval=cmd.ExecuteNonQuery();if(val0)MessageBox.Show(已在表中成功删除指定记录!,记录删除操作);elseMessageBox.Show(表中未找到要删除的记录,记录删除操作);,11.3.5DataAdapter对象,获取Command对象SQL语句执行得到的结果集,将其填充到DataSet对象中,并且将DataSet里更新数据的结果返回到数据库,Fill()方法,将数据源数据填充到本机的DataSet或者DataTable中,填充完成后与数据库服务器的连接就自动断开然后可以对DataSet中的数据集进行浏览、插入、修改和删除等操作,操作完成后,利用DataAdapter对象的Update()方法恢复与数据库的连接,把DataSet或者DataTable中的处理结果更新到数据库中然后再次断开数据库连接,实例11.7,例11.7利用OleDbDataAdapter和DataGridView实现数据库内容的显示和交互式更新,例11.7代码(1),OleDbDataAdapteradapter;DataTabletable=newDataTable();privatevoidForm1_Load(objectsender,EventArgse)stringstr=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=student.mdb;stringsql=Select*From学生基本情况表;adapter=newOleDbDataAdapter(sql,str);OleDbCommandBuilderbuilder=newOleDbCommandBuilder(adapter);adapter.DeleteCommand=builder.GetDeleteCommand();adapter.InsertCommand=builder.GetInsertCommand();adapter.UpdateCommand=builder.GetUpdateCommand();,例11.7代码(2),privatevoidmenuBrowsing_Click(objectsender,EventArgse)/查看adapter.Fill(table);dataGridView1.DataSource=table;privatevoidmenuSaving_Click(objectsender,EventArgse)/保存dataGridView1.EndEdit();adapter.Update(table);MessageBox.Show(修改后的数据已经成功地保存到数据库中,数据保存);,11.3.6DataSet对象,用来存储从数据库查询到的数据结果,由于获得数据或更新数据后立即与数据库断开,所以程序员能用它实现高效的数据库操作。,11.3ADO.NET,DataSet对象,11.3.6DataSet对象,存储从数据库查询到的数据结果获得数据或更新数据后立即与数据库断开通过DataAdapter对象从数据库获取数据,并把修改后的数据更新到数据库,DataAdapter的桥梁作用,1DataTable和DataRow对象,Rows属性常用方法,Add():把DataTable的NewRow()方法创建的行追加到末尾InsertAt():把NewRow()方法创建的行插入到索引号指定的位置Remove():删除指定DataRow对象,并从物理上删除数据源中对应数据RemoveAt():根据索引号,直接删除指定行的数据,Columns属性常用方法,Add():把新创建的列添加到列集合中AddRange():把DataColumn类型的数组添加到列集合中Remove():把指定名称的列从列集合中移除RemoveAt():把指定索引位置的列从列集合中移除,实例11.8,例11.8在窗体上添加菜单和DataGridView控件,然后以编程方式创建DataTable对象,并在DataGridView控件中显示其内容,实例11.8程序代码,privatevoidmenuBrowsing_Click(objectsender,EventArgse)DataTabletable=newDataTable();table.Columns.Add(姓名,typeof(string);table.Columns.Add(工作单位,typeof(string);table.Columns.Add(电话号码,typeof(string);DataRowrow=table.NewRow();row姓名=熊壮;row工作单位=重庆大学计算机学院;row电话号码table.Rows.Add(row);row=table.NewRow();row姓名=宋文强;row工作单位=第三军医大学生物医学工程学院;row电话号码table.Rows.Add(row);dataGridView1.DataSource=table;,说明,DataTable和DataRow对象的所有数据都是在内存中生成的,没有涉及到数据库操作,所以不需要建立数据库连接。调用Columns.Add()方法,为DataTable添加了字段,同时确定它们的数据类型,创建表结构。在此基础上,创建DataRow对象,便拥有了执行语句行46添加的字段。把DataGridView添加到窗体时,系统自动弹出“DataGridView任务”对话框,要求选择数据源。本例中DataGridView的数据源是由DataTable对象提供的,所以不必选择数据源。,2DataRow和DataColumn对象,DataRow用来描述数据库表中的记录DataColumn用来描述数据表的字段,DataColumn常用属性,实例11.9,例11.9在窗体上添加菜单和DataGridView,然后以编程方式创建DataColumn和DataRow对象,并在DataGridView中显示其内容,实例11.9程序代码(1),privatevoidmenuBrowsing_Click(objectsender,EventArgse)DataColumncolumn1=newDataColumn(姓名);column1.DataType=typeof(string);column1.MaxLength=10;DataColumncolumn2=newDataColumn(工作单位);column2.DataType=typeof(string);column2.MaxLength=20;DataColumncolumn3=newDataColumn(电话号码);column3.DataType=typeof(string);column3.MaxLength=11;DataTabletable=newDataTable();table.Columns.Add(column1);table.Columns.Add(column2);table.Columns.Add(column3);,实例11.9程序代码(2),DataRowrow=table.NewRow();row姓名=乔梁;row工作单位=第三军医大学生物医学工程学院;row电话号码=132xxxxxxxx;table.Rows.Add(row);row=table.NewRow();row姓名=宋坤霞;row工作单位=成都医学院计算机教研室;row电话号码=135xxxxxxxx;table.Rows.Add(row);dataGridView1.DataSource=table;,说明,(1)使用table.Columns.Add()可以直接为DataTable对象table添加新的字段(2)但Add()方法只能指定字段名和数据类型(3)使用DataColumn对象,不仅可以指定字段名和数据类型,还能指定更多的属性,11.4结构化查询语言,一种用来操作数据库的标准语言SQL语言集数据定义(DataDefine)、数据查询(DataQuery)、数据操纵(DataManipulation)和数据控制(DataControl)功能于一体,可以十分方便地实现对数据库的各种操作,11.4.1SQL的构成,SQL命令中的子句,FromWhereGroupByHavingOrderBy用来修改查询条件通过这些子句,可以进一步定义要选择和要操作的数据,SQL运算符,逻辑运算符And、Or、Not比较运算符、=、=、BetweenLikeIn它们通常出现在Where子句中,11.4.2SQL的语法,Select字段表From表名Where查询条件GroupBy分组字段Having分组条件OrderBy字段DESC,SQL说明,字段表查询结果中包含的字段列表,字段之间用逗号分开。如果使用星号“*”,则表示选择表的全部字段。在字段后面使用As别名,则用别名代替原来的字段名。From子句用于指定一个或多个表。如果所选的字段来自不同的表,则字段名前面应加表名前缀。Where子句用于构造查询条件,确定哪些记录会被选中。GroupBy子句把指定字段列表中具有相同值的记录合并成一个分组。如果Select语句中含有统计函数,就为每个记录创建摘要值。Having子句在利用GroupBy完成的记录分组中,筛选出满足Having子句条件的所有记录。OrderBy子句对检索结果进行排序,默认为升序,使用DESC选项表示降序。Select和From子句必不可少,说明从何处查找所要求的数据。通过使用Select语句,可以返回一个记录集。,SQL中的常用统计函数,11.4.3使用SQL语句查询数据库,(1)查询学生成绩表中所有学生各门课程的成绩Select*From学生成绩表(2)查询学生成绩表中所有学生的心理学和生理学课程的成绩Select学号,心理学,生理学From学生成绩表(3)查询学生成绩表中遗传学和社会学成绩均为80分以上的学生的全部信息Select*From学生成绩表Where遗传学=80And社会学=80(4)将学生成绩表中所有学生的心理学课程成绩按从高到低的顺序排列Select学号,心理学From学生成绩表OrderBy心理学Desc(5)把学生基本情况表和学生成绩表的内容合并输出Select*From学生基本情况表,学生成绩表Where学生基本情况表.学号=学生成绩表.学号,(6)查询心理学课程的最高成绩和最低成绩SelectMax(心理学)As最好成绩,Min(心理学)As最低成绩From学生成绩表(7)统计生理学课程成绩为80分以上的学生人数SelectCount(*)As学生人数From学生成绩表Where生理学=80(8)按籍贯统计来自不同省、市、自治区的学生人数Select籍贯,Count(*)As学生人数From学生基本情况表GroupBy籍贯(9)分别统计男生和女生的文献检索课程平均成绩Select学生基本情况表.性别,AVG(学生成绩表.文献检索)As文献检索平均成绩From学生成绩表,学生基本情况表Where学生成绩表.学号=学生基本情况表.学号GroupBy学生基本情况表.性别(10)统计具有2名以上学生的专业的学生人数Select专业,Count(*)As学生人数From学生基本情况表GroupBy专业HavingCount(*)=2,11.5LINQ技术简介,LINQ(LanguageINtegratedQuery,语言级集成查询)是.NetFramework3.5提供的一种新型查询方法,它提供了类似于SQL语法的遍历、筛选、投影和排序功能,还支持大量的SQL语法(例如Orderby、GroupBy等),和一批统计函数(例如Avg、Sum、Count等)。LINQ不仅能完成对于SQLServer、Oracle等数据库的操作,还可以实现对层次型XML数据和各种集合类型实体对象的操作,例11.13,例11.13找出数组score中所有80分及以上的成绩,并按从小到大的顺序在窗体上显示输出,传统代码,privatevoidForm1_Load(objectsender,EventArgse)this.Text=显示80分以上的成绩并排序;label1.Text=成绩为80分以上的有:n;intscore=68,79,78,87,89,98,90,88,84,76,85,77,100;Array.Sort(score);/利用Array类的静态方法对数组score进行排序foreach(varninscore)/逐个查看数组中的元素if(n=80)/如果80,则在窗体上的label1中输出label1.Text+=n+n;,使用LINQ技术,privatevoidForm1_Load(objectsender,EventArgse)this.Text=显示80分以上的成绩并排序;label1.Text=成绩为80分以上的有:n;intscore=68,79,78,87,89,98,90,88,84,76,85,77,100;varm=fromxinscorewherex=80orderbyxselectx;/用LINQ语句实现查询foreach(varninm)/遍历查询结果集合,输出到窗体上的label1label1.Text+=n+n;,例11.15,例11.15使用LINQ操作SQLServer数据库,查看student.mdf中学生的姓名、学号、专业和生理学、心理学成绩,在当前项目中添加新项,选择LINQtoSQL类,命名为:myStudent.dbml,扩展名必须是.dbml,在新建的myStudent.dbml中,添加连接,如果此时“服务器资源管理器”窗口尚未打开,则执行菜单操作“视图”“服务器资源管理器”将其打开。然后在此窗口中右击“数据连接”,从弹出的快捷菜单中选择单击“添加连接”,打开“添加连接”对话框,在“添加连接”对话框中,单击“更改”按钮,从弹出的“更改数据源”列表(如图)中选择“MicrosoftSQLServer数据库文件”,将数据源更改为“MicrosoftSQLServer数据库文件”,并单击“浏览”按钮,选择SQLServer数据库文件student.mdf(在附带光盘中提供)。必要时可以单击“测试连接”按钮,以检验数据库连接是否正常。,在“服务器资源管理器”窗口中展开student.mdf的树形结构,将“学生成绩表”、“学生基本情况表”拖放到myStudent.dbml窗口中,双击“解决方案资源管理器”窗口中的myStudent.designer.cs,查看自动创建的代码

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论