2009-10-15 70 views
6
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo); 
DataTable dataTable = oleDbDataReader.GetSchemaTable(); 

GetSchemaTable()如何工作?GetSchemaTable()如何工作?

它在RDBMS中從何處獲取信息?

回答

6

IDataReader.GetSchemaTable()的實現取決於提供者 - 因此它會有所不同。您可以編寫自己的提供程序並以任何您想要的方式執行。

說實話,這是在架構設計的不好一點 - 你永遠不應該有接口方法返回一個類型化DataTableDataSet作爲結果可能包含任何數據。有點失敗擺在首位通過接口約束它的點:「你必須有一個返回DataTable的方法,但我們不在乎有什麼樣的行或列」

即使供應商是SQL GetSchemaTable()不會回到[syscolumns][sysobjects]。這將是一個額外的數據庫調用,需要額外的權限,並且無論如何不能工作,因爲結果集不需要反映數據庫中的任何對象。

我不確定,但我希望絕大多數IDataReader.GetSchemaTable()實現可以讀取結果集中保存的元數據的一些屬性。

-1

從每個數據庫中的系統表(例如,syscolumns,sysobjects等)。

+0

這是否始終如此,還是取決於正在使用的OLE DB提供程序? – 2009-10-15 19:39:00

+2

這是錯誤的。結果可能是動態的,用戶可能沒有權限查看sysobjects(在MSSQL 2005+中查看定義)等。 – VladV 2010-07-15 14:00:21

+0

假設你的讀者是通過'SELECT'test',1'?你可以在IDataReader結果集上調用'GetSchemaTable()',它絕對不會檢查'[sysobjects]'。 – Keith 2011-08-17 13:20:40

2

GetSchemaTable()讀取由ADO.NET返回的結果集的元數據。