VB.net数据库编程(08):ADO.net数据访问接口

前端之家收集整理的这篇文章主要介绍了VB.net数据库编程(08):ADO.net数据访问接口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编程语言与数据库的连接是通过一个接口,达到两者交流,以便两者谈情说爱。

一、接口种类:6种:

1、ODBC,面向C/C++。

2、DAO, 面向VB,操作ACCEss

3、RDO,上面的加强型

4、OLE DB

5、ADO, 对OLE DB的加强型

6、ADO.net, ADO的加强型。


二、ADO.net概述:

Ado.net基于XML和离线计算模型。

ADO以Recorderset存储,类似单表,若要多表就要多表连接。必须在线

ADO.net可以在线或离线,DataSet直接可以是多表。

ADO使用Com技术,ADO.net基于XML格式,数据类型更丰富。


体系结构如下:

ADO.net的两个核心组件:.Net数据提供程序(左)、DataSet(右)。

.net数据提供程序用来与数据库的连接。包括Connection,Command,DataReader,DataAdapter四个。

DataSet用来与XML数据连接。设计的目的是独立于任何数据源的数据访问,可有多种不同数据,也可用于XML数据。

DataSet

它内部用XML描述数据,与平台无关。其内常用对象是DataTable和DataRow等。DataSet通过DataAdapter获得数据,

DataAdapter就是DataSet与数据库之间的桥梁,也就是前面的搬运工。它把数据库中的结果集搬运到本地缓存中,这样

就可与数据离线,直接处理DataSet,处理完后,再连接,再搬运回数据库

DataSet有三个特点:

1、独立性:独立于各数据源。即与数据库不发生关系,专注于处理。

2、离线连接: 一般是离线,只是返回数据库时,才保持连接。

3、XML描述: DataSet对象是用XML格式表示的关系型数据视图


数据提供程序

它提供四个对象,保持与不同数据库连接。

1、sqlServer.net数据提供程序,空间:System.Data.sqlClient, 操作sql2000或以上版本。

2、OleDb.net数据提供程序,空间:System.Data.OleDb,主要访问Access,FoxPro等

3、OracleDB.net数据提供程序,空间:System.Data.OracleClient,支持Oracle8.1.7以上版本。

4、ODBC.net数据提供程序,空间:System.Data.Odbc



三、ADO.net的五个核心对象

这个说五个是:

Connection对象负责连接数据库

Command对象负责生成执行sql语句

DataReader对象负责读取数据库的数据

DataAdapter对象负责在Command对象执行完sql语句后生成并填充DataSet和DataTable。

DataSet对象负责存取和更新数据。

1、Connection对象

表示一个数据源的单个连接。


例一:连接Access的例子:



例二:连接sqlserver的例子:





2、Command对象

它用来执行sql语句,执行的结果由DataReader和DataAdapter填充到DataSet中,这样就完成 数据库数据操作的工作 。



注1:CommandType有三个:

Text,说明是一个sql语句,这是默认值,不设置时就是它。

TableDirect,一个要操作的数据表的名

StoredProcedure,一个存储过程。

注2:构造函数有四个,用第三个较多。



2.1、Command的构造函数

就是上面的四个方法,这个是重点。



2.2、ExecuteReader方法

通过DataReader类型的对象,应用程序可获得执行sql命令后的结果集。

这个方法有两种定义:

一是ExecuteReader() :不带参数,直接返回一个DataReader结果集;

二是ExecuteReader(CommandBehavior behavior):根据参数Behavior取值类型,决定DataReader类型。

如果behavior是CommandBehavior.SingleRow,则说明返回的ExecuteReader只是结果集中的第一条数据;

如果behavior是CommandBehavior.SingleResult,则说明只返回在查询结果中多个表里的第一个。

如果behavior是CommandBehavior.SequentialAccess,则说明对于返回的ExecuteReader对象只能顺序

读取它包含的列。一旦读过某列,就不能返回再次读取了,以方便性为代价换取读取数据时的高效率。


无论何结果,ExecuteReader方法返回一个DataReader对象,该对象是一个仅向向的只读数据流,所以主要用来执行

基本SQL查询,要求sql语句返回记录集。


2.2例一:ExecuteReader。

用executeReader返回一个DataReader,然后用它来填充(加载到)另一个对象DataTable中,最后DataTable直接绑定到控件上。

  1. ImportsSystem.Data.sqlClient
  2. PublicClassForm1
  3. PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.Click
  4. DimcnAsNewsqlConnection("DataSource=.;InitialCatalog=Sales;IntegratedSecurity=False;UserID=sa;Password=123456;")
  5. cn.Open()
  6. DimcmdAsNewsqlCommand("select*fromgrade",cn)
  7. DimdrAssqlDataReader'不能new.应用程序不直接创建IDataReader接口的实例,而是创建继承IDataReader的类的实例
  8. dr=cmd.ExecuteReader()
  9. DimdtAsNewDataTable
  10. dt.Load(dr)
  11. DataGridView1.DataSource=dt
  12. cn.Close()
  13. EndSub
  14. EndClass



2.2例二:利用BindingSource来绑定

前面用DataTable绑定数据,下面用BindingSource来绑定。界面一样,代码变化几句:

?
    '前面用DataTable绑定数据,下面用BindingSource来绑定
  1. DimbsAsNewBindingSource
  2. bs.DataSource=dr
  3. DataGridView1.DataSource=bs
  4. cn.Close()
  5. EndSub
  6. EndClass




2.3 ExecuteSaclar方法

Scalar,标量,是一个值。一个结果集可能有多个记录,每个记录可能有多个列值。因此,

方法返回的是首行首列的一个值,其它值忽略。主要用于那些聚合运算,比如求有多少个记录,总计是多少,等等。

?
    DimstrValueAsString=cmd.ExecuteScalar.ToString
  1. MessageBox.Show(strValue)
  2. EndClass


2.4 ExecuteNonQuery方法

即,非查询命令。主要用来执行insert,update,delete和那些没有返回结果集的sql语句,并返回执行命令后影响的行数。

如果insert,update对应的记录不存在,则返回0;如果出错,则返回-1.

注意:因为这个用户不知道成功与否,所以要加入一些提示或再次显示数据库,以便了解执行情况。


前面几节有这个大量的例子,不再列出。





2.5 ADO.net事务处理。

前面说了存储过程,存储过程就是一个批处理。

事务也是一个批处理过程,只不过加强版,即要么全部都成功执行,要么全部失败。(sql自动会控制它)

所以事务有两个作用:

一致性:同时进行的查询和更新彼此不会发生冲突,其它用户不会看到发生了变化但尚未提交的数据;

可恢复性:一旦故障或失败,数据库自动地完全恢复未完成的事务(Rollback)。


ADO.net中,使用Connection和Transaction对象来控制事务,事务顺序包括

一、调用Connecton对象的BeginTransaction方法标记事务的开始。

二、将Transaction对象分配给要执行的Command的Transaction属性

三、执行所需的命令;

四、调用Transaction对象的Commit方法来完成事务,或调用RollBack方法来取消事务。


ADO.net事务处理的优点:简单、运行速度快、独立于数据库

缺点:不能跨多个数据库连接。

事务执行建立在数据库的连接层上,所以需要在事务过程中一直保持数据库连接。


编程流程:

事务开始:Connection对象的BeginTransaction()声明开始

提交事务:即去执行,用Transaction对象的Commit()方法来提交

回滚事务:即事务失败后的全部恢复,用Transaction对象的RollBack()方法来回滚事务。

2.5例:事务提交。

从 这个例子中,可以看到事务是多个sql语句提交执行(批处理),当如果有一条不成功,则全部恢复(不管以前是否成功)。

?
    DimcnAssqlConnection
  1. DimcmdAssqlCommand
  2. cn=NewsqlConnection("DataSource=.;InitialCatalog=Sales;IntegratedSecurity=False;UserID=sa;Password=123456;")
  3. cn.Open()
  4. cmd=NewsqlCommand()
  5. cmd.Connection=cn
  6. DimtransAssqlTransaction'这里不能new.friend成员
  7. trans=cn.BeginTransaction'第一步,开始事务。这句必须在下句前,相当于实例事务对象
  8. cmd.Transaction=trans'cmd要做的事
  9. Try
  10. cmd.CommandText="updategradeset数学=33where姓名like'%周%'"
  11. cmd.ExecuteNonQuery()
  12. cmd.CommandText="updategradeset英语=11where姓名like'%张%'"
  13. trans.Commit()'第二步,执行事务,就是执行上面两个更新操作
  14. Label1.Text="事务提交执行成功"
  15. CatchexAsException
  16. trans.Rollback()'第三步,回滚事务,上面若有失败,则全部恢复执行事务前的状态。
  17. Label1.Text="事务提交失败,所有任务恢复原状。"
  18. EndTry
  19. EndClass






3、DataReader对象

首先说明:DataReader不能实例化,即不能用New。它只能由Command对象ExecuteReader()方法来创建,所以2.2例中没用NEw

DataReader对象提供向前的、只读数据,所以只能依次来读:

DataReader的Read(),提供下一条记录的读取,返回值是布尔值,为真执行成功,为假说明下一条无记录。

这些记录是不能修改的。而DataSet因为是离线数据集,在本地内存中缓存,所以是可以任意修改的。

DataReader从数据库中检索只读数据流,存储在客户端的网络缓存当中。在内存当中只存储一行,所以开销小,速度快。

由于数据不在内存中缓存,所以在检索大量数据时,DataReader是一种较好的选择。


DataRader还是一个霸王,具有独占性,在已经打开DataReader的情况下,将不能对Connection进行任何操作,所以用完了它就

应及时调用Close()方法关闭

通过Command对象返回多个结果集,并且通过DataReader对象NextResult()方法来使用。


再次强调它不能New,只能由Command对象的ExecuteReader()方法来创建 。

创建后,读取DataReader对象中的数据有两种方法

一通过和DataGridView等数据控件绑定,直接输出

二利用循环将数据取出。(即Read()方法进行循环读取)。


例子:用DataReader对象通过循环读取多条记录。

?
    PublicClassForm1
  1. DimcmdAsNewsqlCommand("select*fromgrade",cn)
  2. DimdrAssqlDataReader
  3. dr=cmd.ExecuteReader()
  4. DimstrDisplayAsString=""
  5. Whiledr.Read()
  6. strDisplay&=dr("学号").ToString+Space(5)
  7. strDisplay&=dr("姓名").ToString+Space(5)
  8. strDisplay&=dr("英语").ToString+Space(5)
  9. strDisplay&=dr("语文").ToString+Space(5)
  10. strDisplay&=dr("数学").ToString+Space(5)
  11. strDisplay&=vbCrLf
  12. EndWhile
  13. Label1.Text=strDisplay
  14. EndClass







4、DataAdapter

DataAdapter数据适配器,它就是一个搬运工:从数据源搬运到本地内存中以便来填充DataSet;或者从本地内中数据搬运回到数据源中。

这两者的数据可以是相同,也可是不同,DataAdapter会自动匹配,发挥“适配”的作用。


从数据源到本地内存,然后再填充就用Fill()方法

从本地内存到数据源,进行数据库的更新用Update()方法

DataAdapter对象属性

属 性

@H_301_1079@

说 明

@H_301_1079@

DeleteCommand

@H_301_1079@

获取或设置一个语句或存储过程,以从数据集删除记录

@H_301_1079@

InsertCommand

@H_301_1079@

获取或设置一个语句或存储过程,以在数据源中插入新记录

@H_301_1079@

SelectCommand

@H_301_1079@

获取或设置一个语句或存储过程,用于在数据源中选择记录

@H_301_1079@

UpdateBatchSize

@H_301_1079@

获取或设置每次到服务器的往返过程中处理的行数

@H_301_1079@

UpdateCommand

@H_301_1079@

获取或设置一个语句或存储过程,用于更新数据源中的记录

@H_301_1079@


DataAdapter方法

方法 说明
Dispose 删除该对象
Fill 用从源数据读取的数据行填充至DataSet对象中
FillSchema 将一个DataTable加入到指定的DataSet中,并配置表的模式
GetFillParameters 返回一个用于SELECT命令的DataParameter对象组成的数组

Update 在DataSet对象中的数据有所改动后更新数据源。




4.1 DataAdapter对象的构造函数

搬运工就是双面间谍,要么向本机的DataSet填充数据,要么就向另一个方向的数据库更新数据。


sqlDataAdapter类的构造函数

sqlDataAdapter() 不带参数,创建sqlDataAdapter对象
sqlDataAdapter(sqlCommand selectCommand) selectCommand:指定新创建对象的SelectCommand属性

用参数selectCommand设置其Select Command属性

sqlDataAdapter(string selectCommandText,sqlConnection selectConnection) selectCommandText:指定新创建对象的SelectCommand属性值;

selectConnection:指定连接对象

用参数selectCommandText设置其Select Command属性值,

并设置其连接对象是selectConnection
sqlDataAdapter(string selectCommandText,String selectConnectionString) selectCommandText:指定新创建对象的SelectCommand属性值;

selectConnectionString:指定新创建对象的连接字符串

将参数selectCommandText设置为Select Command属性值,

其连接字符串是selectConnectionString


构造函数可以不带参数,或者带1,2,3个参数,由参数可以看到cmd有时超出自己的范围,跑到Connection的功能上去了。





4.2 DataAdapter对象的Fill()方法

这是搬运工填充本地内存的情况。

调用Fill()方法时,DataAdapter将向数据存储区传输一条Select语句,主要用来填充或刷新DataSet,返回值是影响DataSet的行数。

Fill()方法如下:

int Fill (DataSet dataset) dataset:需要更新的DataSet
根据匹配的数据源,添加或更新参数所指定的DataSet,返回值是影响的行数
int Fill (DataSet dataset,string srcTable) dataset:需要更新的DataSet;

srcTable:填充DataSet的dataTable名(就是别名,用户自己命名一个,可以与原表相同)

根据dataTable名填充DataSet


例子:前面已经有了,不再列出,参见:http://blog.csdn.net/dzweather/article/details/8564039



4.3 DataAdapter的Update()方法

这是搬运工更新服务器数据库的情况。

调用Update()方法时,DataAdapter将检查参数DataSet每一行的RowState属性,根据RowState属性来检查DataSet里

的每一行是否改变及改变的类型,并依次执行所需的Insert,Update,Delete语句,再将改变提交到数据库中,同时

返回影响的DataSet的行数据。


例子:下面用一个添加一行记录,同时更新DataSet和数据库

里面用到了DataRow,这个用于添加一个新行NewRow,然后给新行加值.


?
    PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.Click
  1. DimcnAsNewsqlConnection("DataSource=(local);InitialCatalog=Sales;IntegratedSecurity=False;UserID=sa;Password=123456;")
  2. DimdaAsNewsqlDataAdapter("select*fromgrade",cn)'搬运工拉好水
  3. DimdsAsNewDataSet()'本地内存准备好容器来装水
  4. da.Fill(ds,"mytable")'装水
  5. DimdrowAsDataRow'定义行变量
  6. drow=ds.Tables("mytable").NewRow'行变量是新的一个行
  7. Try
  8. drow("学号")=TextBox1.Text'新行赋值
  9. drow("姓名")=TextBox2.Text
  10. drow("语文")=TextBox3.Text
  11. drow("数学")=TextBox4.Text
  12. drow("英语")=TextBox5.Text
  13. ds.Tables("mytable").Rows.Add(drow)'新行内容加入到表中
  14. DimcmdbAsNewsqlCommandBuilder(da)'和数据库打个电话,本地内存有水要运过去
  15. da.Update(ds,0); background-color:inherit">'上面电话里已经说好了,现在把水运到数据库
  16. DataGridView1.DataSource=ds.Tables("mytable")'绑定到控件上显示当前结果
  17. MessageBox.Show(ex.ToString)
  18. EndTry
  19. PrivateSubDataGridView1_CellClick(senderAsObject,eAsDataGridViewCellEventArgs)HandlesDataGridView1.CellClick
  20. '点击控件,其数据就显示在上面的文本框中
  21. DimaAsInteger=e.RowIndex
  22. TextBox1.Text=DataGridView1.Rows(a).Cells(0).Value.ToString
  23. TextBox2.Text=DataGridView1.Rows(a).Cells(1).Value.ToString
  24. TextBox3.Text=DataGridView1.Rows(a).Cells(2).Value.ToString
  25. TextBox4.Text=DataGridView1.Rows(a).Cells(3).Value.ToString
  26. TextBox5.Text=DataGridView1.Rows(a).Cells(4).Value.ToString
  27. PrivateSubForm1_Load(senderAsObject,eAsEventArgs)HandlesMyBase.Load
  28. 'TODO:这行代码将数据加载到表“SalesDataSet.grade”中。您可以根据需要移动或删除它。
  29. Me.GradeTableAdapter.Fill(Me.SalesDataSet.grade)
  30. EndClass

猜你在找的VB相关文章