熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

掌握ADO.NET的十個熱門技巧[2]

2013-11-13 11:05:52  來源: .NET編程 

 
   運用具有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的重載方法(帶有一組對象)來匹配多個列的值

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15154.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.