日期:2014-05-20  浏览次数:21527 次

ADO.NET相关整理

ADO.NET相关整理
2010年12月09日
  参考地址http://www.shehui001.com/htm/2009825/547.htm
  数据库的应用在我们的生活和工作中已经无处不在,无论是一个小企业的OA系统,还是中国移动的运营系统,似乎都离不开数据库的应用。对于大多数应用程序来说,不管它们是Windows桌面应用程序,还是Web应用程序,存储和检索数据都是其核心功能。所以针对数据库的开发已经成为软件开发的一种必备技能。如果说过去是"学好数理化,走遍天下都不怕",那么,对于今天的软件开发者而言就是"学好数据库,走到哪儿都不怵!"。
  ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX 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则像抽水机,为抽水提供动力和执行方法,通过"水龙头",然后把水返给上面的"水管"。 
  DataAdapter、DataReader就像输水管,担任着水的传输任务,并起着桥梁的作用。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.Open(cn是1个connection对象),但如果这样则需要预先设置好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方法:执行1个SQL查询,既可是选择查询,也可是动作查询。如:
  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、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
  二、使用介绍
  1、创建SqlDataAdapter
  ...
  string strSQL="Select * from Customers";
  SqlCommand cmd=new SqlCommand(strSQL,cn);
  SqlDataAdapter da=new SqlDataAdapter();
  da.SelectCommand=cmd;
  2、SqlDataAdapter构造函数
  ①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,intNumR ecords,"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 语句或存储过程,用于更新数据源中的记录。
  ⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
  ⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。
  2、方法
  ①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
  ②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
  ③GetFillParameters:为SelectCommand获取一个包含着参数的数组。
  ④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。
  3、事件
  ①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。
  ②RowUpdated:向数据库提交一个修改的行之后被触发。
  ③RowUpdating:向数据库提交一个修改的行之前被触发。
  参考地址:http://www.wangluosky.cn/show.asp?id=2302
  DataSet是ADO.NET中的核心概念,作为初学者,可以把DataSet想象成虚拟的表,但是这个表不能用简单的表来表示,这个表可以想象成具有数据库结构的表,并且这个表是存放在内存中的。由于ADO.NET中DataSet的存在,开发人员能够屏蔽数据库与数据库之间的差异,从而获得一致的编程模型。
  7.9.1  DataSet数据集基本对象
  DataSet能够支持多表、表间关系、数据库约束等,可以模拟一个简单的数据库模型。DataSet对象模型如图7-24所示。
  图7-24  DataSet对象模型
  上图简要的介绍了常用对象之间的构架关系。在DataSet中,主要包括TablesCollection、RelationsCollection、ExtendedProperties几个重要对象:
  1.TablesCollection对象
  在DataSet中,表的概念是用DataTable来表示的。DataTable在System.Data中定义,它能够表示存储在内从中的一张表。它包含一个ColumnsCollection的对象,代表数据表的各个列的定义。同时,它也包含RowsCollection对象,这个对象包含DataTable中的所有数据。
  2.RelationsCollection对象
  在各个DataTable对象之间,是通过使用RelationsCollection来表达各个DataTable对象之间的关系。RelationsCollection对象可以模拟数据库中的约束的关系。例如当一个包含外键的表被更新时,如果不满足主键-外键约束,这个更新操作就会失败,系统会抛出异常。
  3.ExtendedProperties对象
  ExtendedProperties对象能够配置特定的信息,例如DataTable的密码,更新时间等等。
  7.9.2  DataTable数据表对象
  DataTable是DataSet中的常用的对象,它和数据库中的表的概念十分相似。开发人员能够将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对象,并通过DataTable的Columns.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(); //使用DataTable的NewRow方法创建一个新DataRow对象
  上述代码使用DataTable的NewRow方法创建一个新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。值得注意的是,DataSet是DataTable的集合,可以使用DataSet的Add方法将多个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) & "
")
  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) & "
")
  Loop
  GetValues 方法
  GetValues 方法是取得字段内所有的记录。这个方法接收一个数组,并且将所有字段填入数组中,如下程序所示:
  Dim arValue(drA.FieldCount)
  drA.Read() '先抓取一笔记录 drA.GetValues(arValue) '将记录填入数组中
  For shtI=0 To drA.FieldCount - 1
  Response.Write(drA.GetValue(shtI) & "
")
  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) &
  "
")
  Next
  Close 方法
  Close 方法可以关闭DataReader 对象和数据源之间的联机。除非把DataReader 对象关闭,否
  则当DataReader 对象尚未关闭时,DataReader 所使用的Connection 对象就无法执行其它的
  动作。
  综合范例
  下列范例在文字输入盒内输入数据表名称,按下确定后程序会将数据表的索引、字段名称、字段
  型态以及字段内容全部显示出来:
  
  
  
  
  
  执行
  
  
  
  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) & "
")
  Next
  Do While drA.Read()
  For shtI=0 To drA.FieldCount-1
  Response.Write(drA.GetValue(shtI) & " / ")
  Next
  Response.Write("
")
  Loop
  End Sub
  
  
  五分钟教你理解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列;这种方法指定了ColumnName和DataType属性。
  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上的ColumnsCollection的Add方法有两个重载(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.dc= dt.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;