数据库技术与应用:chap08-2 断开式访问-绑定_第1页
数据库技术与应用:chap08-2 断开式访问-绑定_第2页
数据库技术与应用:chap08-2 断开式访问-绑定_第3页
数据库技术与应用:chap08-2 断开式访问-绑定_第4页
数据库技术与应用:chap08-2 断开式访问-绑定_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

数据库技术与应用第八章

数据库访问技术(二)8.1ADO.NET基础8.2创建连接8.3命令和数据读取器

—返回单值的查询—执行不返回结果的语句—返回多个结果的查询8.4数据集和数据适配器—填充数据集

—更新数据源—执行存储过程8.5

数据绑定第八章内容提要0.产生背景1.数据集(DataSet)数据集是System.Data.DataSet类的对象,是供所有数据提供程序使用的ADO.NET组件,它独立于数据源。

它的主要作用是在本地高速缓存中存储数据源中的数据,并以脱机方式处理数据。(1)数据集与数据读取器的区别数据读取器(SqlDataReader)是数据提供程序相关类;只读,仅用于查询数据库中数据;占用活动连接,速度快。数据集(DataSet)独立于数据提供程序;可读、写数据库中的数据,特别适用于对数据做修改后更新数据源的场合;支持断开连接,但占用大量资源。

因此,在不需要对数据库更新或数据集的特有功能(如访问XML文件)时,应尽量使用数据读取器。8.4DataSet与SqlDadaAdapter(2)数据集的体系结构其体系结构类似于关系数据库,如右图所示。DataTable在概念上类似于关系(即表),它包含DataRow和DataColumn的集合。DataColumn表示(数据表的)列模式,使用DataTable的Columns属性可获得该表的DataColumn集合,其索引器接受列名或序数索引。DataRow代表行数据,通过DataTable对象的Rows属性可访问这些行数据,其索引器接受基于0的序数索引。数据集是如何组织数据的?数据集体系结构(3)数据集与数据适配器协同工作数据集与数据源是相互独立的,那么怎样将数据源中的数据填充到数据集,又如何用数据集中的数据更新数据源呢?

数据适配器将两者联系起来,它处理连接细节,提供数据源数据到数据集的填充方法,数据集的数据更新数据源的方法。(4)创建方法:DimdsAsDataSet=newDataSet()数据集与数据适配器的关系数据集数据源数据适配器(2)创建方法4种:DimdaasSqlDataAdapter=newSqlDataAdapter()DimdaasSqlDataAdapter=newSqlDataAdapter(cmd)DimdaasSqlDataAdapter=newSqlDataAdapter(sql,conn)DimdaasSqlDataAdapter=newSqlDataAdapter(sql,conStr)SqlDataAdapter对象例.DimmysqlAsString="select*fromsc"DimmyadapterAsSqlDataAdapter=New

_

&SqlDataAdapter(mysql,myconn)(1)作用:是数据集和数据源之间的桥梁。在数据源和数据集之间执行数据传输工作,它通过一个Command对象下达命令,用数据源的数据填充数据集,用数据集更新数据源。SqlDataAdapter对象属性与方法(3)属性与方法数据适配器对象是架构在Command对象上的,并提供了许多配合DataSet使用的方法。常用属性SelectCommandSelectCommand(及下面的三个属性)实质是一个Command对象,用于从数据源中抽取数据。InsertCommand把数据从DataSet对象中插入到数据源(数据库)中。UpdateCommand更新和修改数据源中的数据,数据来自DataSet对象。DeleteCommand用于删除数据源中满足既定条件的数据。主要方法Fill(ds,tableName)执行查询,把SelectCommand返回的数据填充到数据集ds指定的表中。Update(ds,tableName

)把修改(InsertCommand,

UpdateCommand,DeleteCommand)结果由数据集ds中指定的表回填到数据库中。引例

已知Northwind数据库,请查询Categories表中信息,并通过DataGridView控件显示、BindingNavigator控件导航这些信息。界面如右图所示。用数据适配器填充数据集(Fill)控件类别控件name作用属性设置项目属性值DataGridViewdataGridView1显示结果集SelectionModeFullRowSelectBindingNavigatorbindingNavigator1导航DataGridView1BindingNavigator1Categories(CategoryID,CategoryName,Description,picture)PrivateSubForm1_Load(…)HandlesMyBase.Load

DimconnStrAsString="Server=.\sqlexpress;Database=northwind;"_&"IntegratedSecurity=True;"

DimconnAsSqlConnection=NewSqlConnection(connStr)'创建连接

DimsqlAsString="select*from

categories"conn.Open()'打开连接

DimdaAsSqlDataAdapter=NewSqlDataAdapter(sql,conn)'创建适配器

DimdsAsDataSet=NewDataSet()'创建数据集da.Fill(ds,"c")'填充数据集ds的表c

Dimbindingsource1AsNewBindingSourceBindingSource1.DataSource=ds.Tables("c")DataGridView1.DataSource=BindingSource1BindingNavigator1.BindingSource=BindingSource1conn.Close()'关闭连接EndSub程序关键代码小结:利用数据适配器填充数据集步骤如下:创建连接对象创建执行查询的SqlDataAdapter对象创建DataSet对象利用SqlDataAdapter对象的Fill方法填充数据集绑定显示数据集中的数据把数据集的变化保存到数据源中(Update)例8.7已知Northwind数据库中employees表,要求删除表中FisrtName和LastName如textBox1和textBox2中所输入内容的雇员记录。界面如下图所示。1)单击“显示”按钮,显示表中所有记录;2)单击“删除”按钮,将根据textBox1和textBox2输入值删除相应的记录(若不输入,则删除所有记录)。DataGridView1PrivateSub

btnDel_Click(……)

HandlesbtnDel.Click

DimqryAsString=

"select*from

employeeswherefirstnamelike'"+TextBox1.Text+"%'andlastnamelike'"+TextBox2.Text+"%'"

DimdaAsNewSqlDataAdapter()da.SelectCommand=NewSqlCommand(qry,conn)DimdelAsString="deletefromemployeeswherefirstnamelike'"+TextBox1.Text+"%'andlastnamelike'"+TextBox2.Text+"%'"da.DeleteCommand=NewSqlCommand(del,conn)

DimdsAsNewDataSet()

da.Fill(ds,"e")

For

EachrowAsDataRowInds.Tables("e").Rowsrow.Delete()'数据集更新

Nextda.Update(ds,"e")'将更新回写到数据库中EndSub『删除按钮』关键代码Private

Sub

btnDel_Click(……)HandlesbtnDel.Click

DimqryAsString=

"select*from

employeeswherefirstnamelike'"+TextBox1.Text+"%'andlastnamelike'"+TextBox2.Text+"%'"

DimdaAsNewSqlDataAdapter()da.SelectCommand=NewSqlCommand(qry,conn)

DimdsAsNewDataSet()

da.Fill(ds,"e")

DimfltasString="firstnamelikeTextBox1.Text+"%'andlastnamelike'"+TextBox2.Text+"%'"'设置过滤条件

For

EachrowAsDataRowInds.Tables("e").Select(flt)row.Delete()'数据集更新

NextDimdelAsString="deletefromemployeeswhere"_&"employeeid=@employeeid"

DimcmdAsNewSqlCommand(del,conn)

cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid")da.DeleteCommand=cmdda.Update(ds,"e")'将更新回写到数据库中End

Sub设置过滤实现删除@employeeid映射为表e的被删去的employeeid列如何将数据集中数据的变化保存到原来的数据源中呢?

利用sqlDataAdapter对象的update方法,但其前提是需要显式地指定该对象的insertcommand,updatecommand,deletecommand属性值。易出错!!!

简便方法:利用sqlCommandBuilder对象。系统根据sqlDataAdapter对象的selectcommand属性(提取数据库表的元数据),自动构建相应的insertcommand,updatecommand,deletecommand属性值!!!

利用命令构建器简化数据源更新SqlCommandBuilder对象创建(1)使用条件:仅处理一个表,且底层的基本表必须有主键或唯一键。数据适配器的SelectCommand属性必须包含一个查询,且要求该查询返回基本表的主键或唯一键。(2)创建方法:DimsqlAsString=“selectsnum,sname,deptfromstudent”DimdaAsNewSqlDataAdapter(sql,conn)DimbdAsSqlCommandBuilder=newSqlCommandBuilder(da)注意:

如果在调用Update方法后对SelectCommand属性进行了修改,应在命令构建器上调用RefreshSchema方法刷新元数据。使用命令构建器修改例8.7代码

Private

SubbtnDel_Click(……)HandlesbtnDel.Click

DimqryAsString="select*fromemployeeswherefirstnamelike'"+TextBox1.Text+"%'andlastnamelike'"+TextBox2.Text+"%'“

DimdaAsnewSqldataAdapter()da.SelectCommand=NewSqlCommand(qry,conn)DimbuilderAsNewSqlCommandBuilder(da)DimdsAsNewDataSet()da.Fill(ds,"e")For

EachrowAsDataRowInds.Tables("e").Rowsrow.Delete()'数据集更新

Nextda.Update(ds,"e")

'将更新回写到数据库中End

Sub使用命令构建器修改例8.7代码

Private

SubbtnDel_Click(……)HandlesbtnDel.Click

DimqryAsString="select*fromemployeeswherefirstnamelike'"+TextBox1.Text+"%'andlastnamelike'"+TextBox2.Text+"%'“

DimdaAsnewSqldataAdapter()da.SelectCommand=NewSqlCommand(qry,conn)DimbuilderAsNewSqlCommandBuilder(da)DimdsAsNewDataSet()da.Fill(ds,"e")For

EachrowAsDataRowInds.Tables("e").Rowsrow.Delete()'数据集更新

Nextda.Update(ds,"e")

'将更新回写到数据库中End

Sub小结:将数据集的更新保存到数据库步骤如下:创建连接对象创建SqlDataAdapter对象、设置其selectCommand属性以(2)中创建的适配器对象为参数,创建SqlCommandBuilder对象创建数据集对象利用SqlDataAdapter对象的Fill方法填充数据集编辑数据集中的数据利用数据适配器的update方法,将数据集的更新回写到数据库中VB.NET中访问存储过程例8.8创建一个简单的存储过程,完成在DataGridView控件中显示所有学生的平均分数的功能。已知数据表SC(snum,secnum,score)。CREATEPROCsp_avgASSELECTsnum,AVG(score)as_avgFROMscGROUPBYsnumPrivateSubForm1_Load(…)HandlesMyBase.Load

DimconnstrAsString="server=.\sqlexpress;"_

&"database=university;integratedsecurity=true"DimconnAsSqlConnection=NewSqlConnection(connstr)DimcmdAsSqlCommand=NewSqlCommand("sp_avg",conn)cmd.CommandType=CommandType.StoredProcedureDimdaAsSqlDataAdapter=NewSqlDataAdapter(cmd)DimdsAsDataSet=NewDataSetda.Fill(ds,"sc1")DataGridView1.DataSource=ds.Tables("sc1")EndSub在VB.NET中调用无参数存储过程创建带参数的存储过程例8.9创建带输入参数的存储过程,完成显示指定学号的学生所选课程名和分数,数据表为student,sc,course,sections。CREATEPROCsp_snum_score@snumCHAR(4),--输入参数定义@snameVarchar(10)output--输出参数定义ASSELECTcnameAS课程名,scoreAS分数FROMscjoinsectionsjoincourseONum=umONsections.secnum=sc.secnumWHEREsnum=@snumSELECT@sname=snameFROMstudentWHEREsnum=@snumdataGrid1PrivateSubButton1_Click(…)HandlesButton1.ClickDimconnAsNewSqlConnection("server=.\sqlexpress;"_&"database=university;

integratedsecurity=sspi")DimcmdAsNewSqlCommand("sp_snum_score",conn)cmd.CommandType=CommandType.StoredProcedureDiminpAsSqlParameter=cmd.Parameters.Add("@snum",SqlDbType.Char,4)inp.Direction=ParameterDirection.Input'对输入参数可省inp.Value=TextBox1.TextDimoutpAsSqlParameter=cmd.Parameters.Add("@sname",SqlDbType.VarChar,10)outp.Direction=ParameterDirection.OutputDimdaAsNewSqlDataAdapter(cmd)DimdsAsNewDataSet()da.Fill(ds,"score")DataGrid1.DataSource=ds.Tables("score")DataGrid1.CaptionText=cmd.Parameters("@sname").Value+"同学选课记录"EndSub参数名必须与存储过程中的参数名完全相同在VB.NET中调用带参数存储过程小结:创建带参数的SqlCommand对象步骤带参数的sqlcommand创建步骤如下:(1)创建带参数(@开头)的SqlCommand对象(2)设置SqlCommand对象的类型(CommandType属性),默认为

Text(3)添加新参数(使用ADD方法)(4)设置参数Direction属性,默认为Input(5)给输入参数赋值所谓“数据绑定”是指将数据源的成员映射到图形界面组件上,从而该组件可自动使用这些数据。

例如,将一列(但一次只有一个值)绑定到一个TextBox控件的Text属性;或将整个表绑定到数据网格(DataGrid或DataGridView)控件。WinForm控件按照以下两种方式绑定数据:简单数据绑定复杂数据绑定8.5

数据绑定在每个控件属性与数据源的单一元素之间建立一对一关系。简单数据绑定用于一次显示一个值的控件。如果修改了底层的数据源,则控件的Refresh方法会更新绑定的值,以反映该变化。例如:可将textBox1控件的text属性与lable1控件的text属性绑定。TextBox1.DataBindings.Add("text",lable1,"text")简单数据绑定

ADD方法的参数:要绑定的控件属性的名称数据源要绑定的数据源成员的名称复杂数据绑定是控件与数据源的一个或多个数据成员关联。可以用一次允许显示多个值的控件来完成这类绑定。如:

DataGrid(DataGridView)或ListView,显示多列值。ComboBox,显示一列值时使用。通过设置这类控件的dataSource属性,对单列情况进一步指定DisplayMember属性来完成。例如,将comboBox1与数据集ds中表“R”绑定,并显示其中“a”列。comboBox1.DataSource=ds.tables("R")comboBox1.DisplayMember="a"复杂数据绑定设置bindingsource(绑定源)组件的dataSource属性,将绑定源与数据源绑定

dimqryasstring="selectsnum,snamefromstudent"

dimdsasnewDataSet()

dimdaasnewSqlDataAdapter(qry,conn)

da.Fill(ds,"s")Dimbindingsource1asNewbindingsourcebindingsource1.DataSource=ds.Tables("s")控件绑定到bindingsource(绑定源)

comboBox1.DataSource=bindingsource1

comboBox1.displayMember="snum"使用绑定源组件简化数据绑定绑定举例例8.10已知Univeristy数据库中sc,sections表,要求利用控件绑定方法,同步comboBox1、dataGridView1和TextBox1.

界面如右图所示。1)comboBox1绑定查询结果集,并显示其中“学号”列。2)textBox1绑定查询结果集中的“平均分”列。3)dataGridView1绑定并显示查询结果集。comboBox1dataGridView1将其selectionMode属性设为FullRowSelectTextBox1PrivateSubForm1_Load(…)HandlesMyBase.Load

DimconnAsNewSqlConnection("server=.\sqlexpress;

"_

&"database=university;integratedsecurity=sspi")DimqryAsString="selectsnum学号,count(*)as选课门数,avg(score)as平均分

fromscjoinsectionsonsc.secnum=sections.secnumgroupbysnum"DimdaAsNewSqlDataAdapter(qry,conn)DimdtAsNewDataTable()da.Fill(dt)Dimbindingsource1AsNewBindingSource()

bindingsource1.DataSource=dtDataGridView1.DataSource=bindingsource1ComboBox1.DataSource=bindingsource1ComboBox1.DisplayMember="学号"TextBox1.DataBindings.Add("text",bindingsource1,"平均分")EndSub程序关键代码DataGridViewComboBoxTextBoxPrivateSubForm1_Load(……)HandlesMyBase.LoadDimconnAsNewSqlConnection("server=.\sqlexpress;database=university;integratedsecurity=true")DimqryAsString="select学号,选课门数,平均分FROMv_snum_avg"DimdaAsNewSqlDataAdapter(qry,conn)DimdtAsNewDataTableTryda.Fill(dt)DimbsAsNewBindingSourcebs.DataSource=dtDataGridView1.DataSource=bsComboBox1.DataSource=bsComboBox1.DisplayMember="学号"TextBox1.DataBindings.Add("text",bs,"平均分")CatchexAsExceptionMsgBox(ex.Message)EndTryEndSub利用视图实现例8.10视图控件与数据源同步当绑定的数据源有多个数据行时,为了在可用的行中来回移动,控件需要同步。

Windows窗体的BindingNavigator控件和BindingSource组件一起使用,可以达到这个目的。先将控件绑定到BindingSource,后将BindingSource绑定到数据源。控件与数据源同步举例例8.11已知Northwind数据库中employees表,要求利用导航栏,在窗体控件中显示并同步数据源数据,界面如右图所示。DataGridView1TextBox1TextBox2PictureBox1

DimdaAsSqlDataAdapter

DimdtAsNewDataTable()

DimbuilderAsSqlCommandBuilder

Dimbindingsource1AsNewBindingSource()

PrivateSubForm6_Load(……)HandlesMyBase.LoadDimqryAsString="select*fromemployees"da=NewSqlDataAdapter(qry,conn)builder=NewSqlCommandBuilder(da)da.Fill(dt)bindingsource1.DataSource=dtBindingNavigator1.BindingSource=bindingsource1DataGridView1.DataSource=bindingsource1TextBox1.DataBindings.Add("text",bindingsource1,"firstname")TextBox2.DataBindings

温馨提示

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

评论

0/150

提交评论