ADO.NET还是比较常用的,于是我研究了一下ADO.NET,在这里拿出来和大家分享一下,希望对大家有用。根据查询的语法,你可以返回多个结果集。缺省情况下,data reader是位于***个结果集上的。你可以用Read方法在当前结果集中滚动查看记录。在找到***一个记录时,Read方法返回false,不再继续读取。你应该用NextResult方法转移到下一个结果集。如果没有更多的需要读的ADO.NET结果集了,那么该方法返回false。下面的代码说明了如何在所有返回的结果集中访问所有的记录:
- Dim reader As SqlDataReader
- cmd.Connection.Open()
- reader = cmd.ExecuteReader()
- Do
- ' Move through the first resultset
- While reader.Read()
- ' Access the row
- End While
- Loop While reader.NextResult()
- reader.Close()
- cmd.Connection.Close()
#T#当你读一个行的内容时,可以通过索引或名称来识别列。运用索引可以更快,因为提供者可以直接进入到缓冲器中。如果你指定列名,提供者就用GetOrdinal方法将名称转换成相应的索引,然后执行基于索引的访问。注意,对于SQL Server data reader来说,所有的GetXXX方法实际上都调用了相应的GetSqlXXX方法。对于Oracle data reader来说,情况是类似的,本地数据总是被写进.NET Framework类型中。OracleDataReader类为它自己的内部类型提供了一组私有的GetXXX方法。这些方法包括 GetOracleBFile、GetOracleBinary和GetOracleDateTime等。相反,OLE DB和ODBC readers只有单独的一组get方法。
.NET Framework 1.1版通过添加方法HasRows扩展了data readers的编程接口,该方法返回一个Boolean值来说明是否有很多行需要读。(这是ASP.NET 1.0的一个不足之处。)然而,该方法并没有告诉我们有效的行的数量。同样,也没有方法或技巧使我们提前知道已经返回了多少结果集。
在Oracle数据库编程中,一个查询或一个存储过程返回的多个结果集是通过多个REF CURSOR对象处理的。有多少结果集,你就必须将多少输出参数同命令关联起来,以便NextResult方法可以用于Oracle数据库。在命令文本中,一个ADO.NET结果集同一个Oracle REF CURSOR是一致的。输出参数名必须与指针名匹配,它们的类型必须是OracleType.Cursor。例如,如果要运行的存储过程(或命令文本)引用了两个指针(Employees和Orders),那么下面的代码就说明了如何进行设置以返回两个ADO.NET结果集:
- Dim p1 As OracleParameter
- p1 = cmd.Parameters.Add("Employees", OracleType.Cursor)
- p1.Direction = ParameterDirection.Output
- Dim p2 As OracleParameter
- p2 = cmd.Parameters.Add("Orders", OracleType.Cursor)
- p2.Direction = ParameterDirection.Output
在上面的代码中,cmd是一个OracleCommand对象,它指向一个命令或一个存储过程。它执行代码,创建了两个REF CURSOR,称为Employees和Orders。REF CURSOR的名称和ADO.NET输出参数的名称必须匹配。
ADO.NET对象模式包含两个主要的部分——托管提供者和database-agnostic的容器类,如DataSet。托管提供者是数据源连接器的新类型;它们代替了基于COM的OLE DB提供者。到我写这篇文章时为止,只有少数几个托管提供者来连接商业DBMS。.NET Framework 1.1版只包含几个本地提供者——用于SQL Server、Oracle和所有OLE DB的提供者和ODBC驱动程序。第三方的供应商也支持MySQL并为Oracle提供了可供选择的提供者。