1、1,本章主要内容:ADO.NET体系结构; VB.NET与SQL Server数据库的连接; 数据库应用系统开发中的程序设计.,第 8 章 VB.NET与数据库应用程序,2,8.1 数据库访问技术基本概念,1. 通用数据存取(Universal Data Access, UDA) :为了实现“可从任意类型计算机上的任意应用程序中访问任意类型的数据源”,微软提出了UDA概念。而OLE DB和ODBC技术就是这一概念的实现。,3,8.1 数据库访问技术基本概念,UDA的关键是数据访问的透明性。即不管数据在什么地方,数据的提供者可以是各种项目,包括Oracle、 SQL Server数据库、EXCE
2、L、E-Mail、文件系统、消息库等等。UDA通过提供简洁的数据访问层解决了异构数据访问的问题。使程序员可以用统一的编程接口,访问不同的数据源。不会因为数据源的不同,而产生程序编写上的不同。,4,8.1 数据库访问技术基本概念,5,ADO(ActiveX Data Object):是在OLE DB的上层,它进一步简化了数据访问编程。使得应用程序访问数据库变得更加方便简单。 ADO.NET采用ADO体系结构模型,并扩展了功能。 本章重点介绍ADO.NET的对象模型功能以及如何利用这些对象建立VB.NET与数据库之间的数据访问功能。,8.1 数据库访问技术基本概念,6,2. ADO.NET体系结构
3、 ADO.NET的主要技术特点 (1)支持断开连接模型。 断开连接模型是指一旦获得所需的数据,就断开对数据源的连接,使用离线数据集继续在本机上处理数据。优点是大大减少传输切断数据的开销,保证应用程序不会太长时间持有数据库锁或持久连续占用数据库服务器资源,从而生成有高伸缩性的应用程序。,8.1 数据库访问技术基本概念,7,(2)采用XML作为数据交换的格式。XML是跨平台存储和传输数据的工业标准格式,用XML格式发送信息,可以让程序员很容易将共享数据应用程序中的数据处理和用户接口组件分离到不同服务器中,这对于支持多用户的系统来说,可以较大程度地提高系统的性能和可维护性。,8.1 数据库访问技术基
4、本概念,8,ADO.NET组件 两个核心组件:Dataset和.NET数据提供程序(Data Provider) Dataset对象用于保存数据, .NET数据提供程序通过执行SQL命令或存储过程来存取数据。,8.1 数据库访问技术基本概念,9,8.1 数据库访问技术基本概念,10,8.1 数据库访问技术基本概念,数据集:由表集和关系集构成。 表集:由若干表构成。 表:由 行集、列集和约束集构成。,11,说明: Dataset是ADO.NET的断开式结构的核心组件。它的设计目的:实现独立于任何数据源的数据访问。Dataset把数据以XML形式存放在客户端的内存(不是服务器)。Dataset是与
5、数据源断开的,不知道数据提供者,无论数据源是什么,它都会提供一致的关系编程模型。,8.1 数据库访问技术基本概念,12,(2) .NET Framework数据提供程序:用于实现对底层数据源的访问。组件包括:Connection、Command、DataAdapter和DataReader对象。 ( Connection对象提供与数据源的连接。Command对象执行数据库命令。DataReader 从数据源中提供高性能的数据流。DataAdapter 对象执行SQL命令,将数据采集来放入Dataset对象中。 ),8.1 数据库访问技术基本概念,13,在使用DataSet之前, 都是属于Dat
6、aProvider的执行范围, 也就是每家数据库厂商各自的存取方式,所以用户必须选择合适的DataProvider对象。,8.1 数据库访问技术基本概念,.NET Framework提供了四个数据提供程序:它们分别为不同数据源提供数据访问操作支持。如下表。,14,表8.1 ADO.NET的四类数据提供程序,8.1 数据库访问技术基本概念,15,8.2 数据库访问控件对象,访问数据库主要涉及以下控件对象: SqlConnection /数据库连接对象 SqlCommand /执行Sql命令对象 SqlDataAdapter /数据适配器对象,用于采集数据并将数据送到客户端数据集DataSet中
7、DataSet /数据集对象,一个数据集中可存放多个表中内容,16,Datatable /数据表对象,查询结果即可送入数据集Dataset,也可送入表Datatable。 BindingMangerBase / “数据绑定管理器”对象 SqlDataReader /数据只读对象,8.2 数据库访问控件对象,17,8.2 数据库访问控件对象,数据访问操作过程:,18,8.2. 数据库访问控件对象,或,19,8.3 数据更新程序的设计,例1 以下面程序为主讲解更新程序的设计。,运行界面,20,设计界面,8.3 数据更新程序的设计,21,1. 首先在界面上放入以下对象并设置相应属性: (1) Ima
8、gelist图像列表对象Imagelist1。设置属性Image, 在其中放入若干图片。事先收集所用图片并存入该项目的Bin目录下。 (2) ToolBar工具栏对象ToolBar1。设置Buttons属性,为工具栏添加各按钮,如图所示。 (3) Button按钮对象Button1,属性Text=“查询” (4) 若干文本框TextBox对象, 设置Font属性. (5) 若干标签Label对象 和2个GroupBox对象. 设置Text属性和Font属性.,8.3 数据更新程序的设计,22,2. 在工具箱的数据卡中拿一个数据适配器SqldataAdapter1到界面中,可视化配置适配器。SQ
9、L语句为:Select * From 学生 注:也可以拖资源管理器中的“学生”表到界面上,那么“数据库适配器”、适配器用的“数据库连接对象”自动生成。(电脑演示),8.3 数据更新程序的设计,23,3. 选中SqlDataAdapter1,在属性窗口中出现“生成数据集等操作选项” ,如图所示。,单击“生成数据集”选项,生成Dataset11数据集。,4.设置各Textbox对象数据绑定属性DataBings.Text. 例如:TextBox2的属性DataBings.Text为DataSet11.学生.学号,8.3 数据更新程序的设计,24,5. 引用语句和绑定管理器的定义: 访问数据库使用的
10、引用语句 Imports System.Data.SqlClient Public Class student1Inherits System.Windows.Forms.Form定义绑定管理器对象Dim Mybind As BindingManagerBase,8.3 数据更新程序的设计,25,6. Form1窗体对象的Load事件代码: Private Sub student1_Load(。)。DataSet11.Clear()Try执行适配器中查询并将结果填写到数据集中 Me.SqlDataAdapter1.Fill(Me.DataSet11, “学生“)Catch ex As Exce
11、ptionMessageBox.Show(ex.Message)End Try设置绑定管理器管理的表Mybind = Me.BindingContext(Me.DataSet11, “学生“) End Sub,8.3 数据更新程序的设计,26,7. 工具栏ToolBar1的Click事件代码如下: Private Sub ToolBar1_ButtonClick(, ByVal e As ) Select Case e.Button.TextCase “首记录“ 返回首记录Mybind.Position = 0Case “上记录“ 返回上记录Mybind.Position -= 1Case “
12、下记录“ 返回下记录Mybind.Position += 1Case “尾记录“ 返回尾记录Mybind.Position = Mybind.Count - 1Case “新增“Mybind.AddNew(),8.3 数据更新程序的设计,27,Case “修改“Case “删除“ 删除当前记录Mybind.RemoveAt(Mybind.Position ) Case “保存“TryMybind.EndCurrentEdit() 结束编辑状态如果数据集有变化,则保存If Me.DataSet11.HasChanges = True Then SqlDataAdapter1.Update(Me.
13、DataSet11.学生)End IfCatch ex As Exception,8.3 数据更新程序的设计,28,MsgBox(ex.Message)Exit SubEnd TryCase “取消“Mybind.CancelCurrentEdit()重新刷新一次数据集SqlDataAdapter1.Fill(Me.DataSet11, “学生“) Case “关闭“Me.Close()End SelectEnd Sub,8.3 数据更新程序的设计,29,8. “查询”按钮Button1的Click事件代码: Private Sub Button1_Click(。)。Dim sqlstr As
14、 Stringsqlstr = “select * from 学生 where 学号 like “ &_TextBox1.Text & “Me.SqlDataAdapter1.SelectCommand. _CommandText = sqlstrDataSet11.Clear() Me.SqlDataAdapter1.Fill(Me.DataSet11, “学生“) End Sub,8.3 数据更新程序的设计,30,8.4 查询程序的设计,例2:设计按学号或姓名查询的程序。界面如下。,31,8.4 查询程序的设计,步骤:在界面上放以下对象并设置相应 属性. 1. 一个GroupBox对象,3
15、个label对象,3个文本框。 2. 一个button1对象,属性text为“查询”。 3. 一个DataGrid1对象, 可设置Font字体.,4. 引用语句和公共变量定义如下。注意放置的位置。,32,8.4 查询程序的设计,Imports System.Data.SqlClient 引用语句 Public Class Form1Inherits System.Windows.Forms.Form定义数据库连接字符串Dim cnnstr As String = “integrated security=SSPI;data source=MICROSOF-3739C7; initial cat
16、alog=教学数据库“创建数据库连接对象Dim cnn As New SqlConnection( cnnstr ) Dim dt As New DataSet 定义一个数据集定义一个数据适配配对象Dim Adapter As SqlDataAdapter,33,8.4 查询程序的设计,Private Sub Button1_Click (。) 。Dim sqlstr As String 定义存放sql语句的字符串sqlstr = “ select * From 学生 Where 学号 like “ & _snotxt.Text & “%“ & “ and 姓名 like “ & _namet
17、xt.Text & “%“ sql语句创建adapter实例,并指定要执行的sql语句文本和使用的连接 Adapter = New SqlDataAdapter(sqlstr, cnn),5. “查询”按钮的click事件代码:,34,8.4 查询程序的设计,dt.Clear() 清空数据集DtTry根据查询条件填写数据集DtAdapter.Fill(Me.dt, “学生“)Catch ex As ExceptionMessageBox.Show(Ex.Message)Exit SubEnd Try设置DataGrid1的数据源DataGrid1.DataSource = dt.Tables(
18、“学生“),35,8.4 查询程序的设计,求人数Dim Cmd as new SqlCommandsqlstr = “ select count(*) From 学生 Where 学号 like “ & _snotxt.Text & “%“ & “ and 姓名 like “ & _nametxt.Text & “%” sql语句 cmd.CommandText = sqlstrCmd.Connection=cnn cnn.Open()Textbox1.text = cmd.ExecuteScalar ExecuteScalar返回单个值cnn.Close End Sub,36,8.5 调用存
19、储过程的查询程序,例3:通过调用存储过程来实现如下所示的查询程序。,图7-6,37,8.5 调用存储过程的查询程序,方法: 1. 打开SQL Server查询分析器。为“教学数据库”创建一个Student_Sno存储过程。,Create procedure Student_snosno char(6) , sname Varchar(10) asselect * from 学生 where 学号 like sno and 姓名 like sname,38,8.5 调用存储过程的查询程序,图7-7,39,8.5 调用存储过程的查询程序,2. 设计程序界面。 布局如图7-8所示,2个标签Label
20、,2个文本框TextBox,1个按钮Button,1个表格DataGrid。,图7-8,40,8.5 调用存储过程的查询程序,3. 各控件主要属性设置。,41,8.5 调用存储过程的查询程序,4. 代码设计:,Imports System.Data.SqlClient 引用语句 Public Class student_query2Inherits System.Windows.Forms.Form公共变量定义Dim cnnstr As String = “integrated security=SSPI;data source=MICROSOF-3739C7; initial catalog
21、=教学数据库“Dim cnn As New SqlConnection(cnnstr)Dim adapter As SqlDataAdapterDim table1 As New DataTable,42,8.5 调用存储过程的查询程序,查询按钮的Click事件代码Private Sub Button1_Click( 。) 。Dim sqlstr As String table1.Clear() 清空dtable1设置适配器命令文本和连接adapter = New SqlDataAdapter(“student_sno“, cnn) 设置适配器命令文本类型为存储过程adapter.Select
22、Command.CommandType = _CommandType.StoredProcedure,43,8.5 调用存储过程的查询程序,为适配器命令定义参数Dim para_sno As SqlParameter = adapter.SelectCommand.Parameters.Add _(“sno“, SqlDbType.Char, 6) 学号参数Dim para_sname As SqlParameter = adapter.SelectCommand.Parameters.Add _(“sname“, SqlDbType.VarChar, 10) 姓名参数将界面值送入参数para
23、_sno.Value = Me.snotxt.Textpara_sname.Value = Me.nametxt.Text,44,8.5 调用存储过程的查询程序,Try根据查询条件重新填写table1adapter.Fill(table1)Catch ex As ExceptionMessageBox.Show(ex.Message)Exit SubEnd Try设置表格数据源为表Table1DataGrid1.DataSource = table1 End Sub End Class,45,8.6 照片浏览程序设计,例4:浏览学生照片。,46,8.6 照片浏览程序设计,1. 设计程序界面。
24、布局如图上页图所示,2个标签Label,1个文本框TextBox,1个按钮Button,1个图像框PictureBox 2. 属性设置(略)3.代码设计,47,8.6 照片浏览程序设计,Imports System.Data.SqlClient Imports System.IO Public Class append_phtoInherits System.Windows.Forms.Form定义本类中使用的变量和对象Dim cnnstr As String = “integrated security=SSPI;data source=MICROSOF-3739C7; initial ca
25、talog=教学数据库“Dim sqlstr As String 用于装sql语句的字符串变量Dim cnn As New SqlConnection(cnnstr),48,8.6 照片浏览程序设计,定义一个SqlCommand对象Dim cmd As SqlCommand定义一个数据适配器对象Dim adapter As SqlDataAdapter定义一个数据表Dim table1 As New DataTable,49,8.6 照片浏览程序设计,Private Sub Button1_Click( ) 显示照片sqlstr = “select * from 学生 where 学号 lik
26、e “ & _TextBox1.Text.Trim & “adapter = New SqlDataAdapter(sqlstr, cnn)table1.Clear()adapter.Fill(table1) 将数据填入数据表Table1If table1.Rows.Count = 0 Then MessageBox.Show(“没有这个学生!“)PictureBox1.Image = Nothing 清空图像框exit SubEnd If,50,8.6 照片浏览程序设计,Dim b() As ByteTry读照片字段中的数据到数组b = table1.Rows(0)(“照片“) Catch
27、ex As SystemException若不能显示,清除图形框Me.PictureBox1.Image = Nothing MessageBox.Show(“无照片!“)Exit SubEnd Try传送数组B中内容到MemoryStream对象S Dim S As New System.IO.MemoryStream(b),51,8.6 照片浏览程序设计,Try显示照片 Me.PictureBox1.Image = Image.FromStream(S)Catch ex As SystemException若不能显示,清除图形框Me.PictureBox1.Image = Nothing
28、End TryEnd Sub End Class,52,8.7 登录程序设计,例5 系统登录程序。界面如下。,53,8.7 登录程序设计,程序代码 Imports System.Data.SqlClient Public Class Form1Inherits System.Windows.Forms.FormDim adapter As SqlDataAdapterDim dtable As New DataTablePrivate Sub Button2_Click( )取消按钮Me.Close()End Sub,54,8.7 登录程序设计,Private Sub Button1_Clic
29、k( ) 确定按钮Dim sqlstr As StringIf TextBox1.Text 0 and TextBox2.Text 0 Thensqlstr = “select 密码 from 操作员where 用户名 like “ _& TextBox1.Text & “ and 密码 like “ & _TextBox2.Text & “Me.adapter = New SqlDataAdapter(sqlstr, _ SqlConnection1)Me.adapter.Fill(dtable)If dtable.Rows.Count = 0 ThenMessageBox.Show(“密码错误“, “信息提示“)Exit SubEnd If,55,8.7 登录程序设计,MessageBox.Show(“欢迎使用系统“)Dim f2 As New Form2Me.Hide()f2.Show()End IfEnd Sub End Class,56,联系我们:同济大学计算机系计算机基础教研室Http:/,谢谢!,