数据库应用程序设计.ppt_第1页
数据库应用程序设计.ppt_第2页
数据库应用程序设计.ppt_第3页
数据库应用程序设计.ppt_第4页
数据库应用程序设计.ppt_第5页
已阅读5页,还剩147页未读 继续免费阅读

下载本文档

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

文档简介

第九章 数据库应用程序设计,学习目的,能够用VS2008创建数据库 能够创建连接数据库应用程序 能够数据绑定 能够完成数据库相关软件的设计,主要内容,9.1 两类数据库应用程序 9.2 VS2008创建数据库 9.3 结构化查询语言SQL 9.4 连接数据库 9.5 创建连接数据库应用程序 9.6 不连接数据库应用程序及数据绑定 9.7 学生信息管理系统设计 9.8 ComboBox绑定到数据库表 9.9 存储过程 9.10 LINQ to ADO.Net,数据库提供了一种将信息集合在一起的方法。数据库应用系统主要由三部分组成: 数据库管理系统(DBMS),是针对所有应用的,例如ACCESS。 数据库本身,是按一定的结构组织在一起的相关数据。 数据库应用程序,它是针对某一具体数据库应用编制的程序,用来获取,显示和更新数据库存储的数据,方便用户使用。这里讲的是如何编写数据库应用程序。,常见的数据库管理系统有:FoxPro,Access,Oracle,SQLserver,Sybase等。数据库管理系统主要基于3种数据模型:层次模型、网状模型、关系模型。 目前应用最广泛的是基于关系模型的关系数据库,以上所列数据库管理系统都是关系数据库。,数据库分为本地数据库和远程数据库,本地数据库一般不通过网络访问,数据库和数据库应用程序在同一计算机中,本地数据库也称为单层数据库。远程数据库通常位于远程计算机上,用户通过网络来访问远程数据库中的数据。远程数据库可以采用两层,三层或四层结构,两层结构一般采用C/S模式,即客户端和服务器模式。三层模式一般采用B/S模式,用户用浏览器访问WEB服务器,WEB服务器用CGI、ASP、PHP、JSP等技术访问数据库服务器,生成动态网页返回给用户。四层模式是将应用逻辑从Web服务器分离,在WEB服务器和数据库服务器中间增加一个应用服务器。,9.1 两类数据库应用程序,设计一个数据库应用程序可以采用连接方式和不连接方式。所谓连接方式,是数据库应用程序通过SQL语句直接对数据库操作,例如,查找记录、删除记录、修改记录。所谓不连接方式,是数据库应用程序把数据库中感兴趣的数据读入,在内存中建立一个副本,数据库应用程序对副本进行操作,必要时将修改的副本存回数据库。 设计一个连接方式数据库应用程序一般包括以下基本步骤: 建立数据库,包括若干个表,在表中添入数据(若干记录)。 用SqlConnection或OleDbConnection类建立数据库应用程序和数据库连接对象。 使用OleDbCommand或SQLCommand类对象用SQL语句来访问数据库中的数据,直接在数据库的表中查询指定记录、增加记录、删除记录,修改记录中的数据。,使用ADO.Net设计一个不连接方式数据库应用程序一般包括以下基本步骤: 创建数据库,包括若干个表,在表中添入数据。 用SqlConnection或OleDbConnection类建立数据库应用程序和数据库连接对象。 用OleDbAdapter或SqlDataAdapter类对象从数据库指定表中取出感兴趣的记录。 从数据库指定表中取出的感兴趣记录做成一个新表,填充到DataSet类对象中,可填充多个表,并可在DataSet类对象中指定表和表的关系。DataSet对象建立在内存中,可以认为是数据库在内存中的一个子集。取出所有感兴趣的数据后,断开和数据库的连接。 将DataSet类对象中的数据作为数据源,用支持数据绑定的控件(如ListView、TextBox等控件)的属性绑定到DataSet数据源中的表或表的字段,供用户浏览、查询、修改。 及时更新DataSet中的内容,并把修改的数据存回源数据库。,9.2 VS2008创建数据库,使用VS2008正式版,可以访问的数据库及相应的命名空间如下,VS2008速成版仅支持OLE DB和SQL Server文件系统数据库。 SQL Server:System.Data.SqlClient。 Oracle:System.Data.OracleClient。 支持OLE DB数据库(例如ACCESS):System.Data.OleDb。 支持ODBC数据库(例如FoxPro):System.Data.Odbc。,【例9.1】用SQL Server Express创建一个学生信息管理系统数据库,包括3个表,表1记录学生的基本情况,包括以下字段:学号、姓名、性别、相片和密码。表2记录学生的学习成绩,包括以下字段:记录编号、课程名称、分数、拥有该课程成绩学生的学号,表3记录教师的基本情况,包括以下字段:工号、姓名和密码。由于要记录全校所有学生的成绩,把学习成绩表字段定义为:学号、语文成绩、数学成绩、物理成绩等字段是不合适的,这样做,增加一门课程,就要增加一个字段,字段要动态增加,而且不同专业所开设的课程也不相同,某些课程字段只是个别专业使用,这显然不合理。创建数据库具体步骤如下:,(1)运行VS2008程序,选择菜单“视图(V)|其他窗口(E)|数据资源管理器(D)“菜单项,打开“数据资源管理器“窗体,右击字符“数据连接“,在快捷菜单中选择“添加连接(A)“菜单项,打开对话框如图9.1,选择Microsoft SQL Server 数据库文件。单击“继续“按钮,打开对话框如图9.2。单击“浏览(B)“按钮,在打开的对话框中选择保存数据库文件的路径,键入文件名为“StudentMis.mdf“。单击“确定“按钮,打开对话框询问是否创建数据库,单击“是(Y)“按钮,创建数据库。在所选路径下可以看到两个数据库文件:StudentMis.mdf和StudentMis_log.ldf。在“数据资源管理器“窗体将看到这个数据库。,(2)在“数据资源管理器“窗体中展开StudentI.mdf,右击字符“表“,在快捷菜单中,选择“添加新表(T)“菜单项,打开窗体如图9.3,可为新表增加字段。创建学号字段StudentNum,int类型,不允许null,默认值为0,主键;姓名字段StudentName,nvarchar(20) 类型;性别字段StudentSex,nchar(1)类型,注意一个中文字符或英文字符长度都为1。字段StudenTphoto,image类型,允许为空;口令字段StudenPassword,nvarchar(10)类型,必填字段,默认值为123。右击字段StudentNum,在弹出快捷菜单中单击“设置主键(Y)“菜单项,设置字段StudentNum为主关键字,这样每个学生的学号都不能相同,可以用学号字段区分不同记录,方便查询。结果如图9.3。单击工具条“保存“按钮保存该表,表名为“Student“。,(3)在“数据资源管理器“窗体中,右击字符“Student“,在快捷菜单中,选择“显示表数据(S)“菜单项,打开新窗体,可以为“Student “表各个字段输入数据,例如:1,张三,男;2,李四,女;3,王五,男;4,鲁豫,女。 (4)同样方法建立表Score,记录所有学生学习成绩。包括记录编号字段ScoreID,int类型,(是标志)=是;标志增量=1;标志种子=1,即将字段“ID“设为自动增量字段,主关键字;课程名称字段ClassName,nvarchar(30)类型;分数字段Score,int类型;拥有该课程成绩学生的学号字段StudentNum,int类型,必填字段。增加若干数据。建立教师情况表,包括教师工号字段TecherNum,int类型,必填字段,默认值为0,主键;姓名字段TeacherName,nvarchar(20) 类型;口令字段TeacherPassword,nvarchar(10)类型,必填字段,默认值为123。增加若干数据,1,赵云,123;2,关羽,123,其中,关羽是管理员。,9.3 结构化查询语言SQL,数据库应用程序通过SQL(Structed Query Language,结构化查询语言)来访问数据库中的数据,使用SQL语句可以在数据库的表中查询指定记录、增加记录、删除记录,修改记录中的数据。几乎所有的数据库都支持SQL语言,编写数据库应用程序必须学习SQL语言。这里只介绍最基本的SQL语句,读者还应更深入的学习SQL语言。Select语句是最常用的SQL语句,可以从数据库的表中获得满足一些条件的记录集。常见的SQL语句如下: select * from student:从student表中选择所有字段的所有记录。 select StudentNum,StudentName from student:从Student表中选择字段StudentNum和字段StudentName的所有记录,select * from score where StudentNum=1:从score表中查找学号StudentNum=1同学的所有课程的成绩。 Insert Into student(StudentNum,StudentName,StudentSex)Value(5,“田七“,“男“):数据库student表插入一新记录,学号字段为5、姓名字段为“田七“、性别字段为男。 Delete From student where StudentNum=1:删除student表中学号为1的学生。 Update Student Set StudentName=“陈七“ Where StudentNum=1:数据库的Student表中学号为1的学生名字修改为“陈七“:,9.4 连接数据库,创建数据库应用程序,首先必须和数据库建立连接。连接不同的数据库,要使用不同的连接类对象。连接微软Sql Server7.0及以后版本数据库,使用SqlConnection类建立连接效率较高。使用SqlConnection类必须引用如下命名空间:using System.Data.SqlClient; using System.Data;使用SqlConnection类建立连接对象的例子如下: String s=“DATABASE=Northwind;SERVER=localhost;UID=sa;PWD=;“; SqlConnection conn=new SqlConnection(s); Conn.Open(); Conn.Close();,连接不同的数据库,要使用不同的连接字符串,连接字符串将作为连接类对象属性ConnectionString的值。本例连接字符串中,DATABASE为数据库名称,这里为Northwind,必须安装微软Sql Server数据库系统,并安装自带数据库例子Northwind才能使用。SERVER为数据库服务器IP,如数据库服务器和数据库应用程序在同一计算机中,可用localhost。安全验证采用数据库用户密码,UID为用户名,PWD为密码,Northwind数据库有一用户名为sa,密码为空。也可用Windows身份验证,用“Integrated Security=True“替换“UID=sa;PWD=“即可。如使用SQL Server文件系统数据库,修改连接字符串如下,其中D:d.mdf为数据库文件绝对路径,Connect Timeout=30表示30秒内连接不成功将产生异常。 “Data Source=.SQLEXPRESS;AttachDbFilename=D:d.mdf;Integrated Security =True;Connect Timeout=30;User Instance=True“,连接ACCESS或支持OleDb接口的数据库,必须使用OleDbConnection类建立连接,引用如下命名空间:using System.Data;using System.Data.OleDb;其中Provider为所使用的数据库驱动程序,DataSource为数据库位置,studentI.mdb为ACCESS数据库。例子如下: string s=“Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:VC#studentI.mdb“; OleDbConnection conn=new OleDbConnection(s); Conn.Open(); Conn.Close();,9.5 创建连接数据库应用程序,连接方式应用程序用OleDbCommand或SQLCommand类对象记录SQL语句,通过这两个类的方法直接在数据库的表中查询指定记录、增加记录、删除记录,修改记录中的数据。 9.5.1 OleDbCommand和SQLCommand类 建立一个SQLCommand类查询对象方法如下,ACCESS数据库使用OleDbCommand类对象。用这两个类的方法ExecuteNonQuery、ExecuteReader执行的SQL语句。 string s=“SELECT * FROM student“; SQLCommand Command1=new SQLCommand(s,conn);,【例9.2】用户的注册信息应该立即存到数据库表中。下边的例子用于学生信息管理系统的教师注册,教师输入个人信息,单击注册按钮,用SQL语句把数据存到例9.1创建的StudentMis.mdf数据库的Teacher表中。具体步骤如下: (1)新建一个新项目:StudentMis。在窗体中增加2个Texbox控件,textBox1输入学号或工号,textBox2输入姓名。增加1个PasswordBox控件用来输入密码。增加3个TextBlock控件用来说明textBox或PasswordBox控件用途。增加一个GroupBox控件,标题为“选择角色“,在该控件中增加3个RadioButton控件,标题分别为“学生“、“教师“和“管理员“,初始选中学生,即其属性IsChecked=true。增加3个按钮,标题分别为“登录“、“注册“、“关闭“。这个窗体将作为登录对话框。窗体Title为“登录或注册“。如图9.4。,(2)为Window1类增加属性 public string RadioButtonState get string s=null; if(radioButton1.IsChecked=true) s = radioButton1.Content.ToString(); else if (radioButton2.IsChecked = true) s = radioButton2.Content.ToString(); else if (radioButton3.IsChecked = true) s = radioButton3.Content.ToString(); return s; ,(3)在Window1.xaml.cs文件头部引入命名空间using System.Data.SqlClient; (4)在Window1类增加变量:SqlConnection conn; SqlCommand da; (5)为“注册“按钮增加单击事件处理函数如下: private void button2_Click(object sender, RoutedEventArgs e) if (textBox1.Text = “ | textBox2.Text = “ | passwordBox1.Password = “) MessageBox.Show(“所有项都必须填写!“); return; string txt1 = “Data Source=.SQLEXPRESS;“ ; txt1 += “AttachDbFilename=E:应用程序设计教程(第二版)ExampleStudentMis.mdf;“;,txt1 += “Integrated Security=True;Connect Timeout=30;User Instance=True “; conn = new SqlConnection(txt1); string s = RadioButtonState; switch (s) case “教师“: string txt2 = “Insert Into Teacher(TeacherNum,TeacherName,TeacherPassword) Values(“; txt2 += textBox1.Text + “ , “; txt2 += textBox2.Text + “ , “; txt2 += passwordBox1.Password + “)“; conn.Open(); da = new SqlCommand(txt2, conn); da.ExecuteNonQuery();,textBox1.Text = “; textBox2.Text = “; passwordBox1.Password = “; conn.Close(); break; case “学生“: case “管理员“: break; 编译运行,在该对话框中输入工号,姓名,密码,单击“注册“按钮,查看数据库可看到增加了一个记录。,9.5.2 OleDbDataReader和SqlDataReader类,如用户仅顺序浏览一个表的所有数据,并不允许修改数据,如使用DataSet类对象,由于DataSet类对象是数据库在内存中的一个子数据库,将占用较多内存空间,降低计算机的性能。使用OleDbDataReader和SqlDataReader类对象可以克服这个缺点。这两个类可以从数据库表中顺序读出数据,作为只读数据流,并不把读出的数据保存到内存中,减少计算机系统的开销。它们的常用的属性、方法如下: 属性FieldCount:获取当前记录的列数(表的字段数)。 方法Close:关闭OleDbDataReader或SqlDataReader类对象。 方法Read:读一个记录,指针下移,指向下一个记录。 方法GetInt16、GetString、GetByte等:在执行方法Read后,得到参数指定列的数据,注意要和列的相应字段的数据类型匹配。这些方法只有1个参数,表示第几个字段。,【例9.3】下面用一个例子介绍SqlDataReader类的使用方法,该例用SqlDataReader类顺序读出StudentMis数据库Teacher表工号和教师名称逐一显示。具体步骤如下: (1)新建项目。增加语句using System.Data.SqlClient; (2)为Window1类增加变量: SqlConnection conn; SqlCommand da;SqlDataReader dr; (3)在构造函数最后增加如下语句: string s = “Data Source=.SQLEXPRESS; AttachDbFilename=E:应用程序设计教程(第二版)ExampleStudentMis.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True“; conn = new SqlConnection(s);,s = “SELECT * FROM Teacher“; da = new SqlCommand(s, conn); conn.Open(); dr = da.ExecuteReader(); button1_Click(null, null); (4)放置4个TextBlock和1个Button控件到窗体,如图9.3。其单击事件函数如下: private void button1_Click(object sender, RoutedEventArgs e) if (dr.Read() textBlock2.Text = dr.GetInt32(0).ToString(); textBlock4.Text = (dr.GetSqlString(1).ToString(); else MessageBox.Show(“最后一个记录“); ,(5)请注意在程序运行期间,数据库一直保持连接,因此在Window的Closing事件函数中要关闭连接。编译运行。,9.6 不连接数据库应用程序及数据绑定,9.6.1 SqlDataAdapter和DataSet类 DataSet对象是数据库在内存中的一个子集。DataSet类对象可有多个表,并可指定表和表的关系,以及指定表字段的约束信息。DataSet对象只在获取或更新数据时保持和数据库连接,其他时间都是断开的,使数据库可以自由执行其他任务。 OleDbAdapter或SqlDataAdapter类包括如下属性:SelectCommand、InsertCommand、DeleteCommand和UpdateCommand,它们都是OleDbCommand或SQLCommand类对象,可以被设定为相应的SQL语句,实现对数据库中的数据的选择、插入、删除、更新等功能。,建立连接后,可使用OleDbAdapter或SqlDataAdapter类的Fill方法,根据指定的Select SQL语句,从数据库中将指定数据取出,作为一个表填充到内存子数据库DataSet中。DataSet属性Tables是一个数据库表的集合,是子数据库中的所有表,表是DataTable类对象,其属性Rows是一个数据库表的记录集合,表的记录是DataRow类对象。可以对DataSet中数据库表的数据进行修改,修改后的DataSet中数据可通过OleDbAdapter或SqlDataAdapter类的Update()方法,根据指定的Insert、Delete和Update等SQL语句,存回到数据库中。典型用法如下,首先要引用命名空间: System.Data.SqlClient和System.Data;。,string conn =“Data Source=.SQLEXPRESS;AttachDbFilename=D:d.mdf; Integrated Security =True;Connect Timeout=30;User Instance=True“ SqlConnection conn=new SqlConnection(s); string s = “SELECT * FROM Teacher“; da = new SqlDataAdapter(s, conn); SqlCommandBuilder scb=new SqlCommandBuilder(da); ds = new DataSet(); da.Fill(ds, “Teacher“);,9.6.2 DataTable、DataRow和DataView类,DataTable类用来描述内存中一个数据库表。DataRow类表示DataTable中一行数据(一个记录)。DataView类表示用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。这些类的一些用法例子如下,后表的例子将继续介绍三个类的用法。 在指定表中添加新记录: DataRow dr=MyDataSet.Tables“Student“.NewRow(); /建立表Student的新记录 dr“StudentNum“=4; /新记录StudentNum字段的值为4 dr“StudentName“=“鲁豫“; /新记录StudentName字段的值为“鲁豫“ dr“StudentSex“=“女“; /新记录StudentSex字段的值为“女“,修改Student表中第0个记录的“StudentName“字段的值为“田歌“ MyDataSet.Tables“Student“.Rows0“StudentName“=“田歌“; 删除Student表中第0个记录 MyDataSet.Tables“Student“.Rows0.Delete(); 保存所作的修改,下条语句表示如DataSet数据被修改,将修改数据存回源数据库。 if(MyDataSet.HasChanges() sqlDataAdapter1.Update(MyDataSet); 放弃对DataSet中数据所作的修改 if(MyDataSet.HasErros) MyDataSet.RejectChanges(); 一般情况下,并不采用以上方法直接修改DataSet类对象中数据,而是采用支持数据绑定的控件(例如ListView控件)显示、浏览、查询、修改DataSet类对象中的数据。,9.6.3 数据库表的数据绑定,数据绑定的控件隐藏了具体修改数据的代码。所谓数据绑定技术是把数据集的某个或某些数据与控件的某些能够显示的属性绑定在一起的技术,例如将数据绑定到TextBox控件的Text属性,当TextBox控件完成数据绑定后,Text属性将显示数据集中被绑定的数据,同时修改Text属性值也就修改了DataSet中被绑定数据。,【例9.4】本例将studentMis.mdf数据库的Teacher表中所有记录用ListView显示。 (1)新建项目。在Window1.xaml.cs文件头部增加引用命名空间语句: using System.Data.SqlClient; using System.Data; (2)为Window1类增加变量: SqlConnection conn; SqlDataAdapter da; DataSet ds; (3)放置控件ListView到主窗体,将如下ListViewXAML控件标记放到Grid标记中: , (4)修改Window1类构造函数如下,运行界面如图9.6。 public Window1() InitializeComponent(); string sc = “Data Source=.SQLEXPRESS; AttachDbFilename=E:应用程序设计教程(第二版)ExampleStudentMis.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True“; conn=new SqlConnection(sc); string s = “SELECT * FROM Teacher“;,da = new SqlDataAdapter(s, conn); ds = new DataSet(); da.Fill(ds, “Teacher“); listView1.ItemsSource = ds.Tables“Teacher“.DefaultView; ,【例9.5】本例修改例9.4,当双击姓名列标头,对显示的姓名进行排序。 (1)在Window1类中增加变量:DataView view; (2)修改上例Window1类构造函数,删除其最后一条语句,在最后增加如下语句: view = new DataView(); view.Table = ds.Tables“Teacher“; /显示Teacher表 /view.AllowDelete = true; /允许删除,默认值为true /view.AllowEdit = true; /允许编辑,默认值为true /view.AllowNew = true; /允许增加新记录,默认值为true,/view.RowFilter = “TeacherName = 关羽“; /过滤条件,只显示字段TeacherName为关羽的教师view.Sort = “TeacherName ASC“; /升序排列 listView1.ItemsSource = view; / listView1的数据源 (3)编译运行,可以看到姓名按升序排列,顺序为:关羽、鲁六、王五和赵云。现在实现双击姓名列标题,使姓名按降序排列。修改姓名列的XAML标记如下: , 姓名 GridViewColumnHeader的MouseDoubleClick事件函数如下: private void GridViewColumnHeader_MouseDoubleClick(object sender, MouseButtonEventArgs e) view.Sort = “TeacherName DESC“; ,【例9.6】修改例9.4,双击某行密码,可在在ListView控件该行处修改密码。修改密码列的XAML标记如下,请注意标记Mode=TwoWay,表示修改是双向的,即数据源的改动立刻反映的该列,该列数据的修改立刻保存到数据源,IsReadOnly=“True“表示不允许编辑。 , TextBox的MouseDoubleClick(双击事件)和MouseLeave(鼠标离开事件)事件函数如下: private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) TextBox textBox = (TextBox)sender; textBox.IsReadOnly = false; private void TextBox_MouseLeave(object sender, MouseEventArgs e) TextBox textBox = (TextBox)sender; textBox.IsReadOnly = true; ,【例9.7】修改例9.4,在窗体增加两个按钮,标题分别为:删除选定行、增加一行。在窗体增加3个TextBox控件,输入新行的教师编号、教师姓名和密码。删除选定行按钮单击事件函数如下。修改以后的数据并不能自动回存数据源,要使用方法SqlDataAdapter的Update(DataSet)方法将修改数据保存到数据源中。 private void button1_Click(object sender, RoutedEventArgs e) DataRowView drv = (DataRowView)listView1.SelectedItem; drv.Delete(); ,增加一行按钮单击事件函数如下: private void button2_Click(object sender, RoutedEventArgs e) DataView dv = (DataView)listView1.ItemsSource; DataRowView drv = dv.AddNew(); drv“TeacherNum“ = textBox1.Text; drv“TeacherName“ = textBox2.Text; drv“TeacherPassword“ = textBox3.Text; drv.EndEdit(); ,【例9.8】用TextBlock显示Student表的StudentName字段,Image控件显示照片字段,一次显示一个记录,可以前后移动记录,如下: (1)建立一个新项目。在Window1.xaml.cs文件头部增加引用命名空间语句: using System.Data.SqlClient; using System.Data; using System.IO; using Microsoft.Win32; using System.Collections; using System.ComponentModel; (2)用如下标记替换Grid标记: ,(3)在Window1类增加变量: SqlConnection conn;SqlDataAdapter da;DataSet ds; (4)在构造函数最后增加如下语句: string str = “Data Source=.SQLEXPRESS;AttachDbFilename=E:应用程序设计教程(第二版)ExampleStudentMis.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True“; conn = new SqlConnection(str); string txtCommand = “SELECT * FROM Student“; da = new SqlDataAdapter(txtCommand, conn); ds = new DataSet(); da.Fill(ds, “Student“); grid1.DataContext = ds.Tables“Student“.DefaultView;,(5)编译运行,TextBlock控件显示Student表第一个记录的StudentName字段值:张三。但是Image控件不能正确显示张三的照片。这是因为WPF支持字符串类型绑定数据源和字符串类型目标之间转换,例如本例中数据源是数据库的StudentName字段,是字符串类型,TextBlock属性Text是目标,也是字符串类型。WPF并不支持数据绑定源到目标之间的所有类型的转换,例如本例,在Image控件显示照片,数据绑定源是数据库Student表Photo字段,是一个Bytes类型,目标是ImageDrawing的ImageSource,它是BitmapImage类型。为了在Image正确显示照片,必须在Window1类外部定义一个类包含两种类型转换的方法。 System.Windows.Data.ValueConversion(typeof(byte), typeof(BitmapImage),class BinaryImageConverter : IValueConverter object IValueConverter.Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) if (value != null ,object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) BitmapImage image = (BitmapImage)value; byte bytes = null; using (MemoryStream memoryStream = new MemoryStream() JpegBitmapEncoder encoder = new JpegBitmapEncoder(); if (image is BitmapSource) encoder.Frames.Add(BitmapFrame.Create(BitmapSource)image); encoder.QualityLevel = 100; encoder.Save(memoryStream); bytes = memoryStream.ToArray(); return bytes; ,(6)修改Window1.xaml文件的Window标记如下,其中xmlns:local标记是引用类BinaryImageConverter所在命名空间,并命名为local。 (7)定义Window窗体中的资源如下,表示类BinaryImageConverter在标记中的名字。 ,(8)修改标记如下: (9)编译运行,能看到照片,此时只用到第一个方法,从数据库取出数据到Image。下边实现前后移动记录。在Window1类定义变量:BindingListCollectionView view; (10)在构造函数最后增加如下语句: IList dataView = (IListSource)ds.Tables“Student“).GetList(); PropertyDescriptorCollection coll = (ICustomTypeDescriptor)dataView0).GetProperties(); view = (BindingListCollectionView)CollectionViewSource.GetDefaultView(ds.Tables“Student“);,(11)在窗体增加4个按钮,标题分别为:后一记录、前一记录、第一记录,最后记录。为4个按钮增加事件函数如下: private void button3_Click(object sender, RoutedEventArgs e) view.MoveCurrentToNext(); private void button4_Click(object sender, RoutedEventArgs e) view.MoveCurrentToPrevious(); private void button5_Click(object sender, RoutedEventArgs e) view.MoveCurrentToFirst(); private void button6_Click(object sender, RoutedEventArgs e) view.MoveCurrentToLast(); ,(12)编译运行,能够查看所有学生姓名和照片。最后增加替换学生照片功能,在窗体增加一个按钮,标题为:增加或替换照片,其事件函数如下: private void button1_Click(object sender, RoutedEventArgs e) OpenFileDialog openFileDialog1 = new OpenFileDialog(); if (openFileDialog1.ShowDialog().Value) BitmapImage image = new BitmapImage(); image.BeginInit(); image.UriSource = new Uri(openFileDialog1.FileName); image.EndInit(); imageD1.ImageSource=image; ,9.7 学生信息管理系统设计,本节通过创建一个简化的学生信息管理系统,继续介绍ADO.Net数据库应用用程序的概念和设计方法。在例子中尽量使用VS2008工具来完成设计。学生信息管理系统用来管理学生的基本信息及学生成绩信息。允许学生、教师和管理员对数据库进行操作,学生只能查询自己的所有成绩,不能修改数据。教师可以录入学生的成绩。管理员可以添加学生、修改学生信息、删除学生(同时删除该学生的所有课程的成绩)、增加教师,并对学生信息进行查询、排序,但是管理员不能修改学生的学生成绩。因此打开程序后必须首先要登录,根据登录的角色不同,具有不同权限。,根据以上分析,数据库应有3个表,表1记录学生的基本情况,包括以下字段:学号、姓名、性别、相片和密码。表2记录学生的学习成绩,包括以下字段:记录编号、课程名称、分数、拥有该课程成绩学生的学号,表3记录教师的基本情况,包括以下字段:工号、姓名和密码。,9.7.1 学生查询窗口,学生查询成绩窗口显示学声学号和姓名,并列出该学生的所有课程成绩。 【例9.9】本例继续例9.2,创建学生查询成绩窗口步骤如下: (1)参照3.5节的方法,增加一个类名为ShowOneStudentData的显示学生信息的窗体。窗体文件名称为:ShowOneStudentData.xaml,Title属性为“学生信息“。 (2)在ShowOneStudentData.xaml.cs文件头部增加语句:using System.Data; (3)按照图9.7那样设计界面(注意ListView中数据是运行后的结果)。用标记 替换,在标记Canvas中增加如下XAML标记。之所以使用TextBlock控件显示学号和姓名,是因为学生只能浏览,不能修改。因此ListView也不提供编辑功能。, (4)修改学生用窗体ShowOneStudentData类的构造函数如下: public ShowOneStudentData(DataTable table1,DataTable table2) InitializeComponent(); textBlock2.DataContext = table1; textBlock4.DataContext = table1; listView1.ItemsSource = table2.DefaultView; ,9.7.2 项目数据源,使用VS2008可以创建项目数据源,项目数据源提供了很多方法,方便数据库应用程序的设计。具体地说,以StudentMis.mdf数据库为例,当用VS2008创建项目数据源时,将为StudentMis.mdf数据库创建该数据库专用StudentMisDataSet类,该类和DataSet类功能类似,但只能用于StudentMis.mdf数据库。还为每一个使用的数据库表创建该表专用TableAdapter类派生类,例如为StudentMis.mdf数据库Student表创建StudentTableAdapter类,该类Fill方法能从数据库取出数据作为一个表填充到StudentMisDataSet类对象中,GetData方法返回一个记录了从数据库取出的数据的表,Update方法将StudentMisDataSet所作的修改存回到数据库,Insert方法在Student表插入一个新记录,StudentTableAdapter类还可以创建多个不同查询。TableAdapter类和OleDbAdapter或SqlDataAdapter类具有类似的功能,但不能将TableAdapter类强制转换为OleDbAdapter或SqlDataAdapter类,也不能用程序生成TableAdapter类对象,只能用集成环境的数据源配置向导创建,无法创建查询条件由用户输入的该类对象。,(6)为例9.9增加数据源。在菜单中,单击“数据(A)|添加新数据源(N)“菜单项,打开“数据源配置向导“第1个对话框,在对话框中选数据库,单击“下一步“按钮打开“数据源配置向导“第2个对话框,单击“新建连接“按钮,打

温馨提示

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

评论

0/150

提交评论