c#

位置:IT落伍者 >> c# >> 浏览文章

掌握ADO.NET的十个热门技巧[2]


发布日期:2018年07月04日
 
掌握ADO.NET的十个热门技巧[2]

运用具有BLOB字段的ExecuteXmlReader

用于SQL Server的NET数据提供者(data provider)使用了数据库提供的XML扩展名并提供了一个额外的方法(ExecuteXmlReader)来执行查询命令对象上的所有的执行者(例如ExecuteReader和ExecuteScaler)都采用不同的方法来得到结果集ExcecuteReader通过一个托管指针(managed cursor)(data reader)来返回数据而ExecuteScaler返回结果集中的第一个值把它作为一个标量值ExecuteXmlReader执行查询并返回已经绑定到一个XmlTextReader对象的基于XML的输出流通过这种方式你就不需要做额外的工作来以XML的方式加工数据了要实现这一点查询字符串必须返回XML数据对SQL Server来说当查询字符串包含一个FOR XML子句时就可以实现它尽管这只是一种可能

一个不太为人所知的情况是要使ExecuteXmlReader工作让结果集包含XML数据就足够了 下面的查询方法很好只要列包含XML格式的文本就行SELECT data FROM table WHERE key=这个列是个典型的BLOB或ntext字段其文本显示为XML简要地看看ExecuteXmlReader方法的内部结构会有助于我们的理解该方法用ExecuteReader来执行查询并从数据提供者得到一个数据流对象接下来它将数据流绑定到XmlTextReader类的一个新创建的实例上这个实例被返回给调用者连接一直处于忙碌状态直到XML reader停止工作SQL Server提供者是唯一的提供者它提供了方法让我们从一个XML reader直接读取数据但这种做法更多的是与提供者有关而与数据库性能的关系并不大Oracle支持XML查询但Oracle的数据提供者并不支持XML查询相比之下为OLE DB数据提供者编写一个ExecuteXmlReader方法并不难(点此下载实例)

不要设法缓存一个DataView

DataSet和DataTable对象是唯一的包含数据的ADONET对象DataView是一个不能串行化的轻量级的类它只代表构建在一个表上的视图(view)你可以根据一个表达式或行的状态来过滤视图许多应用程序都需要你管理数据视图并将它们绑定到数据控件上如Windows和Web DataGrid控件一个DataView对象不能缓存数据它只是缓存了与当前过滤器相匹配的基本的表中的行的索引缓存索引的顺序与当前的排序表达式一致缓存DataView而不缓存基本的DataTable是不行的

例如提供分页(比如通过运用DataGrid控件)的ASPNET应用程序通常以一个DataView对象结尾因为它支持排序和过滤在有些情况下(大多是基于性能的原因)你可能决定要缓存数据源要缓存的对象不能是DataView(它是你实际绑定的对象)一个DataView只是一种索引如果没有基本的DataTable对象它是没有用的

运用Find来读取一个记录

通过运用DataTable的Select方法来运行一个内存中的查询或在视图上设置一个过滤器来滤掉与指定标准不匹配的所有的记录你就可以读取一个DataTable对象中的一个特定的行了你可以通过设置DataView类上的RowFilter属性来设置一个过滤器这两种方法都运用相同的引擎来选择记录它们可以接纳一个表达式对它进行解析并求各个子句的值DataTable的Select方法返回一个带有所有相匹配的DataRow对象的数组RowFilter属性重建DataView的内部索引来包含所有的(且仅包含)匹配的记录然后应用程序就可以访问记录了这两种方法在性能上几乎是一样的运用哪种方法取决于环境和个人喜好例如如果你用的是数据绑定的控件如一个DataGrid或DataList那么RowFilter就很理想如果你必须处理一串记录那么Select方法就更好了

然而你还可以用另一种方法(仍然是基于DataView的)它是读取一个表中的记录的最快的方法该方法就是用Find

Dim view As DataView

view = New DataView(table)

viewSort = orderid

Dim index As Integer = viewFind()

Dim row As DataRow = view(index)Row

Find方法运用了视图的当前索引并将指定的值(或多个值)与形成当前索引的字段匹配起来在前面的代码中与列orderid匹配如果Sort属性为空且DataTable对象有一个主键那么就运用主键中的列Find方法返回的是相匹配的第一行的基于的位置的值

果你想返回多个记录可以用FindRows的演变形式

viewSort = orderid discount

Dim keys() As Object

keys() =

keys() =

Dim row As DataRow = _

view(viewFind(keys))Row

前面的代码可以让你通过运用Find的重载方法(带有一组对象)来匹配多个列的值

[] [] [] []

               

上一篇:掌握ADO.NET的十个热门技巧[4]

下一篇:掌握ADO.NET的十个热门技巧[1]