对于Windows应用程序我的建议正好相反台式应用程序很适合应用断开的编程模式(DataSet和其它ADONET对象使这种模式变得更简单了)当然这并不意味着你可以在客户端无忧无虑地下载成千上万的记录尽管你可以将ADONET对象用于任何种类的NET应用程序但如何使用它们是随具体情况的不同而不同的
访问多个结果集
根据查询的语法你可以返回多个结果集缺省情况下data reader是位于第一个结果集上的你可以用Read方法在当前结果集中滚动查看记录在找到最后一个记录时Read方法返回false不再继续读取你应该用NextResult方法转移到下一个结果集如果没有更多的需要读的结果集了那么该方法返回false下面的代码说明了如何在所有返回的结果集中访问所有的记录
Dim reader As SqlDataReader
cmdConnectionOpen()
reader = cmdExecuteReader()
Do
@# Move through the first resultset
While readerRead()
@# access the row
End While
Loop While readerNextResult()
readerClose()
cmdConnectionClose()
当你读一个行的内容时可以通过索引或名称来识别列运用索引可以更快因为提供者可以直接进入到缓沖器中如果你指定列名提供者就用GetOrdinal方法将名称转换成相应的索引然后执行基于索引的访问注意对于SQL Server data reader来说所有的GetXXX方法实际上都调用了相应的GetSqlXXX方法对于Oracle data reader来说情况是类似的本地数据总是被写进NET Framework类型中OracleDataReader类为它自己的内部类型提供了一组私有的GetXXX方法这些方法包括GetOracleBFileGetOracleBinary和GetOracleDateTime等相反OLE DB和ODBC readers只有单独的一组get方法
NET Framework 版通过添加方法HasRows扩展了data readers的编程接口该方法返回一个Boolean值来说明是否有很多行需要读(这是ASPNET 的一个不足之处)然而该方法并没有告诉我们有效的行的数量同样也没有方法或技巧使我们提前知道已经返回了多少结果集
在Oracle数据库编程中一个查询或一个存储过程返回的多个结果集是通过多个REF CURSOR对象处理的有多少结果集你就必须将多少输出参数同命令关联起来以便NextResult方法可以用于Oracle数据库在命令文本中一个ADONET结果集同一个Oracle REF CURSOR是一致的输出参数名必须与指针名匹配它们的类型必须是OracleTypeCursor例如如果要运行的存储过程(或命令文本)引用了两个指针(Employees和Orders)那么下面的代码就说明了如何进行设置以返回两个结果集
Dim p
As OracleParameter
p = cmdParametersAdd(Employees OracleTypeCursor)
pDirection = ParameterDirectionOutput
Dim p As OracleParameter
p = cmdParametersAdd(Orders OracleTypeCursor)
pDirection = ParameterDirectionOutput
在上面的代码中cmd是一个OracleCommand对象它指向一个命令或一个存储过程它执行代码创建了两个REF CURSOR称为Employees和OrdersREF CURSOR的名称和ADONET输出参数的名称必须匹配
ADONET对象模式包含两个主要的部分——托管提供者和databaseagnostic的容器类如DataSet托管提供者是数据源连接器的新类型它们代替了基于COM的OLE DB提供者到我写这篇文章时为止只有少数几个托管提供者来连接商业DBMSNET Framework 版只包含几个本地提供者——用于SQL ServerOracle和所有OLE DB的提供者和ODBC驱动程序第三方的供应商也支持MySQL并为Oracle提供了可供选择的提供者
ADONET看起来类似于ADO而且托管提供者在结构上同OLE DB提供者也是可以相比的除了这些相似点外在ADONET中进行有效的编程还需要一套新的技巧和好的方法在大多数情况下你可以通过编写代码得到很多技巧并积累对象模式方面的经验当你在进一步研究ADONET编程时记住我在本文中所讲的这个ADONET技巧吧
[] [] [] []