数据库技术基础,SQL Server&VB.NET,数据库技术基础,本书目录,1,第八章 ADO.NET与数据库访问技术,学习目标:ADO.NET体系结构VB.NET与SQL Server数据库的连接访问数据库常用方法,ADO.NET体系结构,ADO.NET数据库访问过程,Connection,DataBase,DataAdapter,SelectCommand,Fill,Update,DataSet,InsertCommand,UpdateCommand,DeleteCommand,.NET Framework 数据提供程序,.NET Framework 数据提供程序是ADO.NET 结构的另一个核心元素,其组件的设计目的相当明确:实现对底层数据源的访问。这些组件包括:Connection、Command、DataAdapter和DataReader对象。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。,.NET数据提供程序对象模型,ADO.NET DataSet,ADO.NET DataSet 是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型。DataSet 是包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。,Connection对象,SqlConnection对象,SQL Server登录模式:Initial Catalog=mydb;DataSource=myServer;User ID=sa;password=;,SqlConnection对象,Windows登录模式:Initial Catalog=mydb;DataSource=myServer;Integrated Security=True;,DataAdapter对象,DataAdapter 是连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。,如何验证?,创建Connection、DataAdapter、Dataset对象,方法一:从数据源直接拖放数据表,在此过程中由系统自动生成,方法二:通过代码创建,基于断开式访问方法,设计步骤:(1)创建SqlConnection对象(2)创建SqlDataAdapter对象(3)创建DataSet对象(4)为控件指定数据源,用代码创建SqlConnection对象,Dim myconn As New SqlConnection(Initial Catalog=university;Data Source=(local);Integrated Security=True;),Dim myconn As New SqlConnection(Initial Catalog=mydb;DataSource=myServer;User ID=sa;Password=;),用代码创建DataAdapter、Dataset对象,创建数据适配器 Dim mysql As String=“select*from student Dim myadapter As New SqlDataAdapter(mysql,myconn)创建数据集 Dim mydataset As New DataSet myadapter.Fill(mydataset,“student),只能取“student”这个表名吗?,断开式访问模型实例,Private Sub Form1_Load()Handles MyBase.Load Dim myconn As New SqlConnection(“initial catalog=university;data source=.;integrated security=true;)Dim myadapter As New SqlDataAdapter(select*from student,myconn)Dim mydataset As New DataSet myadapter.Fill(mydataset)Me.DataGridView1.DataSource=mydataset.Tables(0)End Sub,上述最后两行代码可以改写为:myadapter.Fill(mydataset,”student”)DataGridView1.DataSource=mydataset.Tables(“student”),DataSet访问结构,库.表.行.列,Dataset.Tables.Rows.Item,mydataset.tables(“表名”).rows(i).item(j),mydataset.tables(“student”).rows(1).item(3),后台数据库设计,CREATE TABLE CasePavilion(CaseNo CHAR(3)not null Primary Key,CaseTitle VARCHAR(30),Feature VARCHAR(500),Highlight VARCHAR(500),图片如何存储?,前台功能代码设计,Imports System.Data.SqlClientPublic Class Form1 Dim myconn As New SqlConnection(initial catalog=UBPA;data source=.SQLExpress;integrated security=SSPI;)Dim myadapter As New SqlDataAdapter(select*from casepavilion,myconn)Dim mydataset As New Data.DataSetPrivate Sub Form1_Load()myadapter.Fill(mydataset,casecity)Me.ComboBox1.DataSource=mydataset.Tables(casecity)Me.ComboBox1.DisplayMember=“CaseTitle”Me.AxWindowsMediaPlayer1.URL=Application.StartupPath&casecity.mp3 Me.AxWindowsMediaPlayer1.Ctlcontrols.play()End Sub,前台功能代码设计,Private Sub ComboBox1_SelectedIndexChanged()Label1.Text=mydataset.Tables(casecity).Rows(Cint(ComboBox1.SelectedIndex).Item(1)TextBox1.Text=mydataset.Tables(casecity).Rows(CInt(Me.ComboBox1.SelectedIndex).Item(3)TextBox2.Text=mydataset.Tables(casecity).Rows(CInt(Me.ComboBox1.SelectedIndex).Item(2)PictureBox1.Image=Image.FromFile(Application.StartupPath&images&mydataset.Tables(casecity).Rows(CInt(Me.ComboBox1.SelectedIndex).Item(0)&.jpg)End Sub,数据绑定,数据绑定是绑定技术中使用最频繁,也是最为重要的技术,也可以说是各种.Net开发语言开发数据库应用程序最需要掌握的基本知识之一。数据绑定之所以很重要,是因为数据绑定技术使得界面上的所有控件访问数据源数据时可以步调一致。,图8.3.1 例8.6程序运行结果,(1)建立SQLServerUBPACases表与t控件之间的数据绑定关系 Public mybind As BindingManagerBase SqlDataAdapter2.Fill(DataSet11.UBPACases)mybind=Me.BindingContext(DataSet11,UBPACases)(如果是.NET2005以上版本,直接用拖放的绑定数据源),(2)用绑定对象的position属性实现UBPACases表的数据浏览 mybind.Position=0/到头 mybind.Position=mybind.Position 1/往前翻 mybind.Position=mybind.Position+1/往后翻 mybind.Position=mybind.Count 1/到尾,(3)用绑定对象的下列方法实现UBPACases表的更新操作 mybind.AddNew()/插入一条记录 mybind.RemoveAt(mybind.Position)/删除当前记录 mybind.EndCurrentEdit()/结束当前更新状态 mybind.CancelCurrentEdit()/取消当前编辑修改 mybind.EndCurrentEdit()SqlDataAdapter1.Update(DataSet11.UBPACases),数据浏览操作StudentBindingSource.MoveFirst()StudentBindingSource.MovePrevious()StudentBindingSource.MoveNext()StudentBindingSource.MoveLast(),更新操作StudentBindingSource.AddNew()StudentBindingSource.RemoveCurrent()StudentBindingSource.CancelEdit()Me.Validate()StudentBindingSource.EndEdit()StudentTableAdapter.Update(Me.UniversityDataSet.student),2005以上版本,mybind=BindingContext(StudentBindingSource)(如果是.NET2005以上版本,直接用拖放的绑定数据源),通过代码实现数据绑定,数据绑定的常规方法是:首先根据应用需求,设计界面;然后在应用程序开始处定义一个绑定数据源对象,并指明其数据源为数据集中的对应表;接着将用于显示数据的控件分别绑定到对应的数据源,这样所有数据控件的显示都可以用这个绑定数据源对象来编程设计,从而完成数据导航功能。,数据绑定设计步骤,1.绑定对象的定义 Public mybind As BindingSource,2.设定绑定对象的数据源 mybind.DataSource=数据集名称 mybind.DataMember=数据表名称,3.将控件和对应数据源绑定 控件.DataBindings.Add(New Binding(Text,mybind,属性名,True),控件名称,控件属性,绑定数据表属性名,数据绑定实例,例8.7 用代码实现城市最佳实践区建设案例的数据访问。,Imports System.Data.SqlClientPublic Class Form4 Dim myconn As New SqlConnection(Data Source=.;Initial Catalog=UBPA;Integrated Security=True;)Dim myadapter As New SqlDataAdapter(SELECT*FROM UBPACases,myconn)Dim mydataset As New DataSet Dim mybind As New BindingSource/定义绑定数据源对象,Private Sub Form4_Load()/生成数据集 myadapter.Fill(mydataset,UBPACases)/为绑定数据源对象设置数据源 mybind.DataSource=mydataset mybind.DataMember=UBPACases/为控件设置要绑定的数据源中对应表的属性 TextBox1.DataBindings.Add(New Binding(Text,mybind,场馆名称,True)TextBox2.DataBindings.Add(New Binding(Text,mybind,案例名称,True)TextBox3.DataBindings.Add(New Binding(Text,mybind,城市,True)TextBox4.DataBindings.Add(New Binding(Text,mybind,造型亮点与案例主题,True)TextBox5.DataBindings.Add(New Binding(Text,mybind,案例位置,True)End Sub,数据-控件绑定实现,mybind.MoveNext(),mybind.MoveLast(),mybind.AddNew(),mybind.RemoveCurrent(),mybind.MoveFirst(),mybind.MovePrevious(),保存更新的编程实现,Private Sub Button7_Click()mybind.EndEdit()/用SqlCommandBuilder对象生成数据适配器myadapter对应的三条更新命令,Dim cmd As New SqlCommandBuilder(myadapter)/然后通过调用myadapter的Update方法将前台窗体的数据更新回填到物理数据库。myadapter.Update(mydataset.Tables(UBPACases)End Sub,Command对象,建立连接后,可以通过Command对象执行SQL命令,从数据源(比如SQL Server)中返回结果。在创建Command对象时,需要指定一个要在数据源上执行的SQL语句和Connection对象。Command对象的SQL语句可以通过CommandText属性进行查询和修改。,Command对象的执行方法,怎样合理使用好 Command对象?,1、通过显式连接,进行COMMAND的执行读操作,对应数据查询功能,执行方式为:ExecuteReader()ExecuteScalar()写操作,对应数据更新功能,执行方式为:ExecuteNonQuery(),2、通过隐式连接,进行COMMAND的执行DataAdapter的Fill和Update方法在连接关闭的情况下自动打开为相关命令属性指定的连接。,应用实例,例:求SC中所有选课学生的平均成绩。,SqlCommand、ExecuteScalar,Private Sub Form1_Load()Handles MyBase.Load Dim sql As String=select avg(score)from scDim myconn As New SqlConnection(Initial Catalog=学生选课;Data_ Source=(local);Integrated Security=SSPI;)Dim mycmd As New SqlCommand(sql,myconn)Dim avg As Integer=0 myconn.Open()avg=mycmd.ExecuteScalar()myconn.Close()MsgBox(平均成绩=&avg)End Sub,SQL_insert命令的执行,Private Sub Button1_Click()Handles Button1.Click Dim myconn=New SqlClient.SqlConnection(integrated security=SSPI;data source=.;initial catalog=tjdb)Dim mysql As String=insert into sc values(&Me.TextBox1.Text&,&Me.TextBox2.Text&,&Val(Me.TextBox3.Text)&)Dim mycmd As New SqlClient.SqlCommand(mysql,myconn)myconn.open()Try mycmd.ExecuteNonQuery()Catch ex As Exception MsgBox(ex.Message)End Try myconn.close()End Sub,SQL_delete命令的执行,Private Sub Button2_Click()Handles Button2.Click Dim myconn=New SqlClient.SqlConnection(integrated security=SSPI;data source=.;initial catalog=tjdb)Dim mysql As String=delete from sc where snum=&Me.TextBox4.Text&and cnum=&Me.TextBox5.Text&Dim mycmd As New SqlClient.SqlCommand(mysql,myconn)myconn.open()mycmd.ExecuteNonQuery()myconn.close()End Sub,ADO.NET数据库访问技术,数据库技术与应用,41,SqlCommand与存储过程的调用,无参数存储过程的执行,Private Sub Form1_Load()Handles MyBase.LoadDim myconn As New SqlConnection(Initial Catalog=学生选课;Data Source=.;Integrated Security=SSPI;)Dim mycmd As New SqlCommand(“sc_avg,myconn)mycomm.CommandType=CommandType.StoredProcedure Dim avg As Integer=0 myconn.Open()avg=mycmd.ExecuteScalar()myconn.Close()MsgBox(平均成绩=&avg)End Sub,Create proc sc_avgAsSelect avg(score)from sc,有输入参数存储过程的执行,Private Sub Button6_Click()Handles Button6.Click Dim avg As Integer Dim myconn=New SqlClient.SqlConnection(integrated security=SSPI;data source=.;initial catalog=tjdb)Dim mycmd As New SqlClient.SqlCommand(get_snum_avg,myconn)mycmd.CommandType=CommandType.StoredProcedure Dim _snum As New SqlClient.SqlParameter(_snum,SqlDbType.NChar,10)mycmd.Parameters.Add(_snum)_snum.Value=TextBox4.Text myconn.open()avg=mycmd.ExecuteScalar()MsgBox(avg)myconn.close()End Sub,create proc get_snum_avg_snum char(10)as select avg(score)from sc where snum=_snum,有输入、输出参数的存储过程的执行,Private Sub Button7_Click()Handles Button7.Click Dim myconn=New SqlClient.SqlConnection(integrated security=SSPI;data source=.;initial catalog=tjdb)Dim mycmd As New SqlClient.SqlCommand(get_cnum_max,myconn)mycmd.CommandType=CommandType.StoredProcedure Dim _cnum=New SqlClient.SqlParameter(_cnum,SqlDbType.NChar,10)mycmd.Parameters.Add(_cnum)mycmd.Parameters(_cnum).Value=TextBox5.Text Dim _max As New SqlClient.SqlParameter(_max,SqlDbType.Decimal,4)mycmd.Parameters.Add(_max)_max.Direction=ParameterDirection.Output myconn.open()mycmd.ExecuteScalar()TextBox6.Text=mycmd.Parameters(“_max”).Value 取值方法一 TextBox6.Text=_max.Value 取值方法二 myconn.close()End Sub,create proc get_cnum_max_cnum char(10),_max decimal outputas select _max=max(score)from sc where cnum=_cnum,思考题,给定学号,查找指定学生的平均成绩。,分析:Step 1 在SQL Server上创建存储过程sc_proc,带有一个输入参数_snum 和一个输出参数_avg。,Step 2 在VB.NET上设计带有一个文本输入框或其他输入控件,用于在运行时获得界面用户输入,以及一个输出控件用于显示存储过程调用的执行结果。,存储过程,create proc sc_proc_snum char(10),_avg int outputas select _avg=avg(score)from sc where snum=_snum group by snum,Private Sub Button3_Click()Handles Button3.Click 带有输出参数的存储过程调用 Dim myconn As New SqlClient.SqlConnection(Initial Catalog=tjdb;Data Source=.;Integrated Security=SSPI;)Dim mycmd As New SqlCommand mycmd.Connection=myconn mycmd.CommandType=CommandType.StoredProcedure mycmd.CommandText=sc_proc Dim myParm1 As SqlParameter=mycmd.Parameters.Add(_snum,SqlDbType.NVarChar,10)Dim myParm2 As SqlParameter=mycmd.Parameters.Add(_avg,SqlDbType.Int,4)输出参数定义 myParm1.Value=Trim(TextBox1.Text)myParm2.Direction=ParameterDirection.Output 输出参数说明 myconn.Open()mycmd.ExecuteScalar()myconn.Close()MsgBox(myParm2.Value)End Sub,用代码定义的数据集的更新,Private Sub Button2_Click()Handles Button2.Click Dim sql As String=select*from sc Dim myconn As New SqlConnection(Initial Catalog=tjdb;Data Source=.;Integrated Security=SSPI;)Dim myadapter As SqlDataAdapter=New SqlDataAdapter(sql,myconn)Dim mydataset As New Data.DataSet myadapter.Fill(mydataset,sc1)Me.DataGrid1.DataSource=mydataset.Tables(sc1)Dim sc_row As DataRow=mydataset.Tables(sc1).NewRow sc_row(0)=Me.TextBox1.Text.ToString sc_row(1)=Me.TextBox2.Text.ToString sc_row(2)=CInt(Me.TextBox3.Text)mydataset.Tables(sc1).Rows.Add(sc_row)Dim cm As SqlCommandBuilder=New SqlCommandBuilder(myadapter)Dim insert_str As String=cm.GetInsertCommand.CommandText myadapter.Update(mydataset,sc1)End Sub,谢谢同学们!,