ADO.NET運用具有BLOB字段的ExecuteXmlReader
掌握了一門技術的理論知識你未必可以很好的運用它,因為在實際和理論還有一個過渡,這里我們就來看看怎樣更好的對ADO.NET運用提高效果。用于SQL Server的.NET數據提供者(data provider)使用了數據庫提供的XML擴展名,并提供了一個額外的方法(ExecuteXmlReader)來執行查詢。命令對象上的所有的執行者(例如ExecuteReader 和ExecuteScaler)都采用不同的方法來得到結果集。
#T#ExcecuteReader通過一個托管指針(managed cursor)(data reader)來返回數據,而ExecuteScaler返回結果集中的第一個值,把它作為一個標量值。ExecuteXmlReader執行查詢,并返回已經綁定到一個XmlTextReader對象的基于XML的輸出流。通過這種方式,你就不需要做額外的工作來以XML的方式加工數據了。要實現這一點,查詢字符串必須返回XML數據。對SQL Server來說,當查詢字符串包含一個FOR XML子句時,就可以實現它。盡管這只是一種可能。
一個不太為人所知的情況是,要使ExecuteXmlReader工作,讓結果集包含XML數據就足夠了。下面的查詢方法很好,只要列包含XML格式的文本就行ADO.NET運用見圖1:SELECT data FROM table WHERE key=1
圖1. ADO.NET運用查詢XML數據
這個列是個典型的BLOB或ntext字段,其文本顯示為XML。簡要地看看ExecuteXmlReader方法的內部結構會有助于我們的理解。該方法用ExecuteReader來執行查詢,并從數據提供者得到一個數據流對象。接下來,它將數據流綁定到XmlTextReader類的一個新創建的實例上,這個實例被返回給調用者。連接一直處于忙碌狀態,直到XML reader停止工作。SQL Server提供者是唯一的提供者,它提供了方法讓我們從一個XML reader直接讀取數據,但這種做法更多的是與提供者有關,而與數據庫性能的關系并不大。Oracle支持XML查詢,但Oracle的數據提供者并不支持XML查詢。相比之下,為OLE DB數據提供者編寫一個ExecuteXmlReader方法并不難(點此下載實例)。