ADO.NET相关整理

趣味理解ADO.NET对象模型

参考地址http://www.shehui001.com/htm/2009825/547.htm

数据库的应用在我们的生活和工作中已经无处不在,无论是一个小企业的OA系统,还是中国移动的运营系统,似乎都离不开数据库的应用。对于大多数应用程序来说,不管它们是Windows桌面应用程序,还是Web应用程序,存储和检索数据都是其核心功能。所以针对数据库的开发已经成为软件开发的一种必备技能。如果说过去是学好数理化,走遍天下都不怕,那么,对于今天的软件开发者而言就是学好数据库,走到哪儿都不怵!

ADO.NET是微软新一代.NET数据库的访问架构,ADOActiveX Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用来开发数据库应用程序。

为了更好地理解ADO.NET的架构模型的各个组成部分,我们可以对ADO.NET中的相关对象进行图示理解,如图5-3所示的是ADO.NET中数据库对象的关系图。

 

5-3 ADO.NET对象模型

我们可以用趣味形象化的方式理解ADO.NET对象模型的各个部分,如图5-4所示,可以看出这些对象所处的地位和对象间的逻辑关系。

 

ADO.NET趣味理解图

对比ADO.NET的数据库对象的关系图,我们可以用对比的方法来形象地理解每个对象的作用,如图5-4所示。

  • 数据库好比水源,存储了大量的数据。
  • Connection好比伸入水中的进水笼头,保持与水的接触,只有它与水进行了连接,其他对象才可以抽到水。
  • Command则像抽水机,为抽水提供动力和执行方法,通过水龙头,然后把水返给上面的水管
  • DataAdapterDataReader就像输水管,担任着水的传输任务,并起着桥梁的作用。DataAdapter 像一根输水管,通过发动机,把水从水源输送到水库里进行保存。DataReader 也是一种水管,和DataAdapter不同的是,DataReader不把水输送到水库里面,而是单向地直接把水送到需要水的用户那里或田地里,所以要比在水库中转一下更快更高效。
  • DataSet则是一个大水库,把抽上来的水按一定关系的池子进行存放。即使撤掉抽水装置(断开连接,离线状态),也可以保持的存在。这也正是ADO.NET的核心。
  • DataTable则像水库中的每个独立的水池子,分别存放不同种类的水。一个大水库由一个或多个这样的水池子组成。

 

 

Connection 物件

   Connection 对象主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开,是无法从数据库中取得数据的。这个物件在ADO.NET 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。

 

Command 物件

   Command 对象主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源

 

 

DataAdapter 物件

   DataSetCommand 对象主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。在Beta 2 版中DataSetCommand 物件会更名为DataAdapter

 

DataSet 物件

   DataSet 这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataSetCommand 对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataSetCommand 对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataSetCommand 对象当做DataSet 对象以及数据源间传输数据的桥梁。

 

DataReader 物件

   当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。

ADO.NET Connection方法简介

大家有知道在ADO.NET中有七个对象,这里就不在一一的介绍了,今天我们只对在ADO.NET中重要的对象之一Connection对象的方法和大家一起分享一下。

1.ADO.NET Connection方法使用Open

建立与数据源的物理连接。格式:

1.  connection.Open ConnectionString,UserID,Password,Options 

注意:该方法是使Connection获得初始化的方法,只有使用了该方法,Connection对象才真正在内存中存在。后面的参数都是可选参数,最简单如:cn.Opencn1connection对象),但如果这样则需要预先设置好ConnectionString 等参数。其中,connectionstring是前面提到的连接字符串,UserID是建立连接的用户的代号,Password是建立连接的用户的密码。该参数会覆盖掉在连接字符串中设置的密码;options提供了连接选择,可选值只有adAsyncConnect异步连接,缺省为-1同步连接。

2.ADO.NET Connection方法使用Close

关闭1个数据连接对象,使该连接对象只留在本机内存中,可对其属性更改后再重新建立连接。(注:如果不是关闭对象,而是将对象从内存中清除,应使用 Set connection对象变量=Nothing..获取数据源上的有关信息:OpenSchema方法,该方法获取与数据源有关的信息,如获取数据源中所有表的名称等。格式:Set Recordset对象=cn.OpenSchema(查询类别,[明细条目])。两个参数都是常数值,其中,每个查询类别中包含多个明细条目,每个明细条目作为返回的Recordset的一个字段,可以省略第二个参数,这时返回指定类别下的所有明细条目的信息生成一个Recordset。例如类别为”adSchemaTables常数中包含了TABLE_NAME(表名称)和TABLE_TYPE(表类型)等多个明细项目常数,而主要应了解类别常数adSchema…以得到数据源某方面信息,可以查对象浏览器。举例如下(得到所有表名):

2.  Dim rstSchema As ADODB.Recordset  

3.  Private Sub Form_Load()  

4.  DataEnvironment1.Command1 '初始化数据环境  

5.  Set rstSchema = DataEnvironment1.Connection1.OpenSchema(adSchemaTables)  

6.  Do While Not rstSchema.EOF '获取所有表名  

7.  List1.AddItem rstSchema.Fields("TABLE_NAME")  

8.  rstSchema.MoveNext  

9.  Loop  

10. Set MSHFlexGrid1.DataSource = rstSchema '可看到更多信息。  

11. End Sub 

Execute方法:执行1SQL查询,既可是选择查询,也可是动作查询。如:

12. cn.Execute "Delete From BB where 姓名 like '嫖客店'" 

但要注意:使用ADO.NET Connection方法的Execute方法返回的游标类型是最基本的只能读和只能向前移动的游标adOpenForwardOnly,因此,如果该方法执行一个选择查询返回一个记录集时特别要明白。举一个完整的例子如下:

13. Dim cn As ADODB.Connection  

14. Dim rst As ADODB.Recordset  

15. Private Sub Command2_Click()  

16. rst.MoveNext  

17. Print rst("姓名")  

18. End Sub  

19. Private Sub Form_Load()  

20. Set cn = New ADODB.Connection  

21. Set rst = New ADODB.Recordset  

22. cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=C:/WINDOWS/Desktop/lxn.mdb" 连接字符串  

23. cn.Open 连接  

24. cn.Execute "Delete From BB where 姓名 like '嫖客店'" 动作查询  

25. Set rst = cn.Execute("Select * from BB") 选择查询,生成记录集  

26. Do While Not rst.EOF  

27. List1.AddItem rst("姓名")  

28. rst.MoveNext  

29. Loop  

30. End Sub  

ADO.NET Command对象简介

Command 对象简介

Command 对象最主要的工作是透过Connection 对象对数据源下达操作数据库的命令。

我们以下列语法产生Command 对象:

Dim cmA As Command = New ADOCommand

或是在产生对象的时候顺便指定属性:

Dim cmA As Command = New ADOCommand("CommandText",ActiveConnection)

 

 

Command 对象常用的属性:

属性

说明

ActiveConnection

设定要透过哪个连结对象下命令

CommandBehavior

设定Command 对象的动作模式

CommandType(Text/TableDirect/StoredProcedure)

 

命令型态(SQL 陈述、数据表名称、预存程序)

CommandText

要下达至数据源的命令

CommandTimeout

指令逾时时间

Parameters

参数集合

RecordsAffected

受影响的纪录笔数

范例中直接输入数据表名称,将数据表中的所有数据传回:

Dim cmA As Command

cmA.CommandType=CommandType.TableDirect

cmA.CommandText="Members"

 

 

Command 对象常用的方法

Execute                        透过Connection 对象下达命令至数据源

Cancel                         放弃命令的执行

ExecuteNonQuery                使用本方法表示所下达的命令不会传回任何纪录

Prepare                        将命令以预存程序储存于数据源,以加快后续执行效率

 

产生独立的Command 对象

使用Command 对象,不一定要明确地宣告一个Connection 对象。可以在产生Command

对象的时候,将ActiveConnection 参数所要指定的连结对象改成ConnectionString 即可。不过

独立的Command 对象并不代表不需要Connection 对象,而是由Command 对象来自动产生它。在使用独立的Command 对象之前要明确的将连结打开,我们可以利用ActiveConnection.Open()方法来开启连结,如下所示:

Dim cmA As ADOCommand = New _

ADOCommand("SQL 陈述", "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:/Inetpub/wwwroot/cr/ch05/MyWeb.mdb;" & _"User ID=Admin"

cmA.ActiveConnection.Open() '将连结打开

 

 

下面例子将使用者信息输入到数据库中:

Sub btnSubmit_Click(Sender As Object, e As EventArgs)

Dim strConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:/InetPub/wwwroot/CR/CH05/MyWeb.mdb"

Dim cmA As ADOCommand = New ADOCommand("",strConStr)

CmA.ActiveConnection.Open()

cmA.CommandText="Insert Into Members Values('" & _

Text1.Value & "','" & Text2.Value & ",'" & _

Text3.Value & "','" & Text4.Value & "','" & _

Text5.Value & "','" & Text6.Value & "')"

cmA.Execute()

Sp1.InnerText="这个叙述影响了" & cmA.RecordsAffected & "笔资料"

End Sub

ADO.NET读书笔记系列之------SqlDataAdapter对象

一、特点介绍
  1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
  2、在SqlDataAdapterDataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
  二、使用介绍
  1、创建SqlDataAdapter
  
...
  
string strSQL=“Select * from Customers”;
  
SqlCommand cmd=new SqlCommand(strSQL,cn);
  
SqlDataAdapter da=new SqlDataAdapter();
  
da.SelectCommand=cmd;
  2SqlDataAdapter构造函数

  string strConn=“Provider=.....”
   string strSQL=“select * from Customers”
   SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
  string strConn=“Provider=.....”

   SqlConnection cn=new SqlConnection(strConn);
  
SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);
  string strConn=“Provider=.....”

   string strSQL=“select * from Customers”
   SqlConnection cn=new SqlConnection(strConn);
  
SqlCommand cmd=new SqlCommand(strSQL,cn);
  
SqlDataAdapter da=new SqlDataAdapter(cmd);
  3、从查询中获取结果

  使用Fill方法
   ...
  
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
  
DataSet ds=new DataSet();
   da.Fill(ds); //这里ds中的表名为
Table
  使用Fill方法创建DataTable对象和DataColumn对象

   ...
  
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
   da.TableMapping.Add(“Table”
“Customers”);
  
DataSet ds=new DataSet();
  
da.Fill(ds);
  使用重载Fill方法

   SqlDataAdapter.Fill(DataSet,“Customers”);
  
SqlDataAdapter.Fill(DataTable);
  
SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);
  开放和关闭连接

   如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。
   ...
  
SqlDataAdapter daCustomers,daOrders;
  
daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);
  
daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
  
DataSet ds=new DataSet();
  
cn.Open();
  
daCustomers.Fill(ds);
  
daOrders.Fill(ds);
  
cn.Close();
  多次调用Fill方法

   刷新DataSet中的数据,最简单的解决方法就是清空DataSet(DataTable),然后再次调用DataAdapter对象的Fill方法。
  三、属性方法事件介绍

  1、属性

  AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)
  DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
  InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
  SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
  UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
  TableMappingsSqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
  ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)
  2、方法
  Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
  FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
  GetFillParameters:为SelectCommand获取一个包含着参数的数组。
  Update:向数据库提交存储在DataSet(DataTableDataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。
  3、事件
  FillError:当DataAdapter遇到填充DataSetDataTable的一个错误时,该事件被触发。
  RowUpdated:向数据库提交一个修改的行之后被触发。
  RowUpdating:向数据库提交一个修改的行之前被触发。

 

 

ado.net DataSet数据集对象

参考地址:http://www.wangluosky.cn/show.asp?id=2302

DataSetADO.NET中的核心概念,作为初学者,可以把DataSet想象成虚拟的表,但是这个表不能用简单的表来表示,这个表可以想象成具有数据库结构的表,并且这个表是存放在内存中的。由于ADO.NETDataSet的存在,开发人员能够屏蔽数据库与数据库之间的差异,从而获得一致的编程模型。

 

7.9.1  DataSet数据集基本对象

DataSet能够支持多表、表间关系、数据库约束等,可以模拟一个简单的数据库模型。DataSet对象模型如图7-24所示。

 

 

 

7-24  DataSet对象模型

 

上图简要的介绍了常用对象之间的构架关系。在DataSet中,主要包括TablesCollectionRelationsCollectionExtendedProperties几个重要对象:

 

1TablesCollection对象

 

DataSet中,表的概念是用DataTable来表示的。DataTableSystem.Data中定义,它能够表示存储在内从中的一张表。它包含一个ColumnsCollection的对象,代表数据表的各个列的定义。同时,它也包含RowsCollection对象,这个对象包含DataTable中的所有数据。

 

2RelationsCollection对象

 

在各个DataTable对象之间,是通过使用RelationsCollection来表达各个DataTable对象之间的关系。RelationsCollection对象可以模拟数据库中的约束的关系。例如当一个包含外键的表被更新时,如果不满足主键-外键约束,这个更新操作就会失败,系统会抛出异常。

 

3ExtendedProperties对象

 

ExtendedProperties对象能够配置特定的信息,例如DataTable的密码,更新时间等等。

 

7.9.2  DataTable数据表对象

DataTableDataSet中的常用的对象,它和数据库中的表的概念十分相似。开发人员能够将DataTable想象成一个表。并且可以通过编程的方式创建一个DataTable表。示例代码如下所示。

 

            DataTable Table = new DataTable("mytable"); //创建一个DataTable对象

 

            Table.CaseSensitive = false; //设置不区分大小写

 

            Table.MinimumCapacity = 100; //设置DataTable初始大小

 

            Table.TableName = "newtable"; //设置DataTable的名称

 

上述代码创建了一个DataTable对象,并为DataTable对象设置了若干属性,这些属性都是常用的属性,其作用分别如下所示。

 

q CaseSensitive:此属性设置表中的字符串是否区分大小写,若无特殊情况,一般设置为false,该属性对于查找,排序,过滤等操作有很大的影响。

 

q MinimumCapacity:设置创建的数据表的最小的记录空间。

 

q TableName:指定数据表的名称。

 

一个表必须有一个列,而DataTable必须包含列。当创建了一个DataTable后,就必须向DataTable中增加列的。表中列的集合形成了二维表的数据结构。开发人员可以使用Columns集合的Add方法向DataTable中增加列,Add方法带有两个参数,一个是表列的名称,一个是该列的数据类型。示例代码如下所示。

 

            DataTable Table = new DataTable("mytable"); //创建一个DataTable

 

            Table.CaseSensitive = false; //设置不区分大小写

 

            Table.MinimumCapacity = 100; //设置DataTable初始大小

 

            Table.TableName = "newtable"; //设置DataTable的名称

 

            DataColumn Colum = new DataColumn(); //创建一个DataColumn

 

            Colum = Table.Columns.Add("id", typeof(int)); //增加一个列

 

            Colum = Table.Columns.Add("title", typeof(string)); //增加一个列

 

上述代码创建了一个DataTable和一个DataColumn对象,并通过DataTableColumns.Add方法增加DataTable的列,这两列的列名和数据类型如下:

 

q 新闻ID:整型,用于描述新闻的编号。

 

q 新闻标题TITLE:字符型,用于描述新闻发布的标题。

 

注意:上述代码中,DataTable的列的数据类型使用的只能是.net中数据类型,因为其并不是真实的数据库,所以不能直接使用数据库类型,必须使用typeof方法把.net中的数据类型转换成数据库类型。

 

7.9.3  DataRow数据行对象

在创建了表和表中列的集合,并使用约束定义表的结构后,可以使用DataRow对象向表中添加新的数据库行,这一操作同数据库中的INSERT语句的概念类似。插入一个新行,首先要声明一个DataRow类型的变量。使用NewRow方法能够返回一个新的DataRow对象。DataTable会根据DataColumnCollection定义的表的结构来创建DataRow对象。示例代码如下所示。

 

           DataRow Row = Table.NewRow(); //使用DataTableNewRow方法创建一个新DataRow对象

 

上述代码使用DataTableNewRow方法创建一个新DataRow对象,当使用该对象添加了新行之后,必须使用索引或者列名来操作新行,示例代码如下所示。

 

            Row[0] = 1; //使用索引赋值列

 

            Row[1] = "datarow"; //使用索引赋值列

 

上述代码通过索引来为一行中个各列赋值。从数组的语法可以知道,索引都是从第0个位置开始。将DataTable想象成一个表,从左到右从0开始索引,直到数值等于列数减1为止。为了提高代码的可读性,也可以通过直接使用列名来添加新行,示例代码如下所示。

 

            Row["bh"] = 1; //使用列名赋值列

 

            Row["title"] = "datarow"; //使用列名赋值列

 

通过直接使用列名来添加新行与使用索引添加新行的效果相同,但是通过使用列名能够让代码更加可读,便于理解,但是也暴露了一些机密内容(如列值)。在数据插入到新行后,使用Add方法将该行添加到DataRowCollection中,示例代码如下所示。

 

            Table.Rows.Add(Row); //增加列

 

7.9.4  DataView数据视图对象

当需要显示DataRow对象中的数据时,可以使用DataView对象来显示DataSet中的数据。在显示DataSet中的数据之前,需要将DataTable中的数据填充到DataSet。值得注意的是,DataSetDataTable的集合,可以使用DataSetAdd方法将多个DataTable填充到DataSet中去,示例代码如下所示。

 

            DataSet ds = new DataSet(); //创建数据集

 

            ds.Tables.Add(Table); //增加表

 

填充完成后,可以通过DataView对象来显示DataSet数据集中的内容,示例代码如下所示。

 

            dv = ds.Tables["newtable"].DefaultView; //设置默认视图

 

DataSet对象中的每个DataTable对象都有一个DefaultView属性,该属性返回表的默认试图。上述代码访问了名为newtable表的DataTable对象。开发人员能够自定义DataView对象,该对象能够筛选表达式来设置DataView对象的RowFilter属性,筛选表达式的值必须为布尔值。同时,该对象能够设置Sort属性进行排序,排序表达式可以包括列名或一个算式,示例代码如下所示。

 

            DataView dv = new DataView(); //创建数据视图对象

 

            DataSet ds = new DataSet(); //创建数据集

 

            ds.Tables.Add(Table); //增加数据表

 

            dv = ds.Tables["newtable"].DefaultView; //设置默认视图

 

            dv.RowFilter = "id" = "1"; //设置筛选表达式

 

            dv.Sort = "id"; //设置排序表达式

 

技巧:要显示DataSet中某项的值,可以使用语法ds.Tables[“表名称”].Rows[0][“列名称”].ToString()来显示,这种语法通常需要知道行的数目以免在访问数据时越界。

 

ADO.NET DataReader对象简介

http://august.blog.51cto.com/59588/6961

DataReader 对象

如果我们利用Command 对象所执行的命令是有传回数据的Select 叙述,此时Command 对象

会自动产生一个DataReader 对象。DataReader 是我们写ASP.NET 网页的好朋友,因为我们

常常会将数据源的数据取出后显示给使用者,这时候我们就可以使用DataReader 对象。我们就

可以在执行Execute 方法时传入一个DataReader 型态的变量来接收。DataReader 对象很单纯

的一次只读取一笔纪录,而且只能只读,所以效率很好而且可以降低网络负载。由于Command

对象自动会产生DataReader 对象,所以我们只要宣告一个指到DataReader 对象的变量来接收

即可,并不需要使用New 运算子来产生;另外要注意的是 DataReader 对象只能配合Command对象使用 ,而且DataReader 对象在操作的时候Connection 对象是保持联机的状态。

 

下列程序代码片段传回可以读取Members 数据表中所有的纪录的DataReader 对象:

Dim cmA As ADOCommand= New

ADOCommand("命令字符串","Provider=Microsoft.Jet.OLEDB.4.0;"

& "Data Source=C:/Inetpub/wwwroot/cr/ch05/MyWeb.mdb")

Dim drA as ADODataReader

cmA.ActiveConnection.Open()

cmA.CommandText="Select * From Members"

cmA.Execute(drA)

当我们将DataReader 对象传入Execute 方法后,就可以使用DataReader 对象来读取数据了。

以下为DataReader 常用的属性:

 

属性                                        说明

FieldCount                         只读,表示纪录中有多少字段

HasMoreResults                     表示是否有多个结果,本属性和SQL Script 搭配使用。

HasMoreRows                        只读,表示是否还有资料未读取

IsClosed                           只读,表示DataReader 是否关闭

Item                               只读,本对象是集合对象,以键值(Key)或索引值(Index)的方式取得纪录中某个字段的数据

RowFetchCount                      用来设定一次取回多少笔记录,预设为值为1

 

了解DataReader 对象有什么属性后,我们就可以利用DataReader 所提供的方法来取回资料了。

下表为DataReader 常用的方法:

方法                                          说明

Close                                 DataReader 对象关闭

GetDataTypeName                       取得指定字段的数据型态

GetName                               取得指定字段的字段名称

GetOrdinal                                取得指定字段名称在纪录中的顺序

GetValue                             取得指定字段的数据

GetValues                                 取得全部字段的数据

IsNull                                    用来判断字段内是否为Null

NextResult                                用来和SQL Script 搭配使用,表示取得下一个结果

Read                                  DataReader 读取下一笔记录,如果有读到数据则传回True,若没有纪录则传回False

Read 方法

在取得Command 对象执行Execute 方法所产生的DataReader 对象后,我们就可以将纪录中

的数据取出使用。DataReader 一开始并没有取回任何数据,所以我们要先使用Read 方法让

DataReader 先读取一笔数据回来。如果DataReader 对象成功取得数据则传回True,若没有取

得资料则传回False。这样一来我们就可以利用Do While...Loop 循环来取得所有的数据,如下

程序所示:

Do While drA.Read()

Response.Write("User Id: " & drA.Item("UserId") & ", Password: ")

Response.Write(drA.Item(1) & "<br>")

Loop

上述程序代码片段利用Read 方法将数据取回后,再利用Item 集合以键值(Key)的方式取出

UserId 字段的数据,以及利用索引值(Index)取得使用者UserPwd 字段的数据;索引值是由0

开始计数,故第一个字段的索引值为0,依此类推。当数据读取完毕后Read 方法会传回False

所以就跳出循环。

GetValue 方法

我们也可以使用GetValue 方法取得指定字段内的记录,这个方法和Item 属性很像;不过

GetValue 方法的参数只接收索引值,并不接收键值为参数。我们改用GetValue 取得所有字段

内的数据,如下程序所示:

Do While drA.Read()

Response.Write("User Id: " & drA.GetValue(0) & ", Password: ")

Response.Write(drA.GetValue(1) & "<br>")

Loop

GetValues 方法

GetValues 方法是取得字段内所有的记录。这个方法接收一个数组,并且将所有字段填入数组中,如下程序所示:

Dim arValue(drA.FieldCount)

drA.Read() '先抓取一笔记录

drA.GetValues(arValue) '将记录填入数组中

For shtI=0 To drA.FieldCount - 1

Response.Write(drA.GetValue(shtI) & "<br>")

Next

因为索引值是由零开始算,所以我们在使用For...Next 循环的时候记得将结束值减一。

 

GetDataTypeName 以及GetName 方法

GetDataTypeName 方法可以传回指定字段的数据型态,而GetName 方法则是传回指定字段的

字段名称(就是键值)。这两个方法一样以键值或是索引的方式来指定字段。下列程序代码片段

显示每个字段的名称以及数据型态:

Dim shtI As Short

For shtI = 0 To drA.FieldCount - 1

Response.Write("索引值为 " & shtI.ToString & " 的字段, 名称为: " & _

DrA.GetName(shtI) & ", 数据型态: " & DrA.GetDataTypeName(shtI) &

"<br>")

Next

Close 方法

Close 方法可以关闭DataReader 对象和数据源之间的联机。除非把DataReader 对象关闭,否

则当DataReader 对象尚未关闭时,DataReader 所使用的Connection 对象就无法执行其它的

动作。

 

 

综合范例

下列范例在文字输入盒内输入数据表名称,按下确定后程序会将数据表的索引、字段名称、字段

型态以及字段内容全部显示出来:

<%@Import Namespace=System.Data.ADO%>

<%@Import Namespace=System.Data%>

<Html>

<Form Id="F1" Runat="Server">

<Input Id="Text1" Runat="Server" Value="Members"/>

<Button Id="Button1" OnServerClick="Button1_Click"

Runat="Server">执行

</Button>

</Form>

<Script Language="VB" Runat="Server">

Sub Button1_Click(sender As Object, E As EventArgs)

Dim cmA As ADOCommand=New _

ADOCommand("","Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:/Inetpub/wwwroot/cr/ch05/MyWeb.mdb")

Dim drA As ADODataReader

Dim shtI As Short

cmA.ActiveConnection.Open()

cmA.CommandType=CommandType.TableDirect

cmA.CommandText=Text1.Value

cmA.Execute(drA)

For shtI=0 To drA.FieldCount - 1

Response.Write("字段索引值: " & shtI.ToString & _

" 字段名称: " & drA.GetName(shtI) & _

" 数据型态: " & drA.GetDataTypeName(shtI) & "<br>")

Next

Do While drA.Read()

For shtI=0 To drA.FieldCount-1

Response.Write(drA.GetValue(shtI) & " / ")

Next

Response.Write("<br>")

Loop

End Sub

</SCRIPT>

</Html>

 

 

五分钟教你理解ADO.NET数据表

http://developer.51cto.com/art/200911/161041.htm

ADO.NET还是比较常用的,于是我研究了一下ADO.NET数据表,ADO.NET数据表(DataTable)是指内存数据表,在这里拿出来和大家分享一下,希望对大家有用。它包含一个表示该表的模式的列集合(ColumnsCollection)。一个数据表还包含有一个列集合(RowsCollection),表示该表所拥有的数据。它记得最初的的状态以及当前的状态,并跟踪已经发生的各种变化。要使用数据表,用户必须包含System.Data

创建ADO.NET数据表

1.  DataTable有两个构造函数:  

2.  public DataTable()  

3.  public DataTable(string tableName) 

ADO.NET数据表添加列

DataTable包含一个DataColumn对象集合。这个列集合定义了该表的结构。要给这个集合添加一个新列,可以使用这个集合的Add方法。在下面的例子中,我们使用ColumnsCollection类的Add方法,给一个数据表添加了3列;这种方法指定了ColumnNameDataType属性。

4.  DataColumn dc = null;  

5.  DataTable dt = new DataTable("test");  

6.  dc = dt.Columns.Add("CustID",System.Type.GetType("System.Int32") );          

7.  dc = dt.Columns.Add("CustomerNameLast", System.Type.GetType("System.String") );  

8.  dc = dt.Columns.Add("CustomerNameFirst", System.Type.GetType("System.String") );  

9.  dc = dt.Columns.Add("Purchases", System.Type.GetType("System.Double") ); 

DataTable上的ColumnsCollectionAdd方法有两个重载(overload)函数:

10. Public DataColumn Add(String columnname, Type type)  

11. Public DataColumn Add(String columnname) 

表达式列

ADO.NET还允许用户创建和定义表达式列。ADO+中的表达式用于进行:过滤, 计算, 汇总列信息。要创建一个表达式列,需要将DataType属性设置为适合该表达式返回数值的类型;然后将Expression属性设为一个有效的表达式:

12. DataColumn dc = New DataColumn;  

13. dc.DataType = System.Type.GetType("System.Currency");  

14. dc.Expression = "total * .086"

你还可以使用Add方法来创建一个表达式列。例如,下面的代码添加了一列,根据客户购买金额的10%计算折扣。这个表达式将名为“Purchases”的列乘以10%。

15. DataColumn dc = New DataColumn;  

16. dcdt.Columns.Add("rectg", System.Type.GetType("System.Double"), "total * 0.1"); 

当这个表加入数据后,这个列的数值将是total列中数值的10

自动增量列

DataColumn 的另一个特性是其能够作为自动增量列的能力。自动增量列在添加新列时,自动增加该列中的数值。要创建一个自动增量列,需要将这个列的 AutoIncrement属性设为真(true)。一旦设置了这个属性,该列开始时将使用该列的AutoIncrementSeed属性中定义的数值。在添加了一列后,自动增量列的数值将按该列的AutoIncrementStep属性中的数值作为步长递增。

17. dc = dt.Columns.Add("CustID",System.Type.GetType("System.Int32") );  

18. dc.AutoIncrement = true;  

19. dc.AutoIncrementSeed = 1;  

20. dc.AutoIncrementStep = 1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章