2009-10-15 73 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返回的结果集的元数据。