【问题标题】:How Does GetSchemaTable() Work?GetSchemaTable() 如何工作?
【发布时间】:2009-10-15 19:23:12
【问题描述】:
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTable dataTable = oleDbDataReader.GetSchemaTable();

GetSchemaTable() 是如何工作的?

它在 RDBMS 中从哪里获取信息?

【问题讨论】:

    标签: c# oledbdatareader getschematable


    【解决方案1】:

    IDataReader.GetSchemaTable() 的实现取决于提供者 - 因此会有所不同。您可以编写自己的提供程序并以任何您想要的方式进行操作。

    老实说,这在框架中是一个糟糕的设计——你永远不应该有返回无类型 DataTableDataSet 的接口方法,因为结果可能包含任何内容。 Kinda 打破了首先通过接口限制它的点:“你必须有一个返回 DataTable 的方法,但我们不在乎它有哪些行或列”

    即使提供程序是 SQL GetSchemaTable() 也不会返回到 [syscolumns][sysobjects]。这将是一个额外的数据库调用,需要额外的权限并且无论如何都不起作用,因为结果集不需要反映数据库中的任何对象。

    我不确定,但我预计绝大多数 IDataReader.GetSchemaTable() 实现会读取结果集保存的元数据的某些属性。

    【讨论】:

      【解决方案2】:

      GetSchemaTable() 读取 ADO.NET 返回的结果集上的元数据。

      【讨论】:

        【解决方案3】:

        来自每个数据库中的系统表(例如,syscolumns、sysobjects 等)。

        【讨论】:

        • 总是这样,还是取决于所使用的 OLE DB 提供程序?
        • 错了。结果可能是动态的,用户可能无权查看系统对象(MSSQL 2005+ 中的查看定义)等。
        • 假设你的读者是SELECT 'test', 1?你可以在IDataReader 结果集上调用GetSchemaTable(),它肯定不会检查[sysobjects]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多