Как работает GetSchemaTable()?
-
21-09-2019 - |
Вопрос
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTable dataTable = oleDbDataReader.GetSchemaTable();
Как это GetSchemaTable()
работать?
Откуда он получает свою информацию в RDBMS?
Решение
Реализация IDataReader.GetSchemaTable()
зависит от поставщика - так что это будет варьироваться.Вы можете написать свои собственные провайдеры и делать это так, как вам захочется.
Честно говоря, это плохая часть дизайна в фреймворке - у вас никогда не должно быть интерфейсных методов, которые возвращают нетипизированное DataTable
или DataSet
поскольку этот результат может содержать все, что угодно.В некотором роде лишает смысла ограничивать это интерфейсом в первую очередь: "у вас должен быть метод , который возвращает DataTable
но нам все равно, какие в нем строки или столбцы ".
Даже если поставщиком является SQL GetSchemaTable()
не возвращается к [syscolumns]
или [sysobjects]
.Это был бы дополнительный вызов базы данных, требующий дополнительных привилегий и не работающий в любом случае, поскольку результирующий набор не обязательно должен отражать какие-либо объекты в базе данных.
Я не уверен, но я бы ожидал, что подавляющее большинство IDataReader.GetSchemaTable()
реализации для чтения некоторых свойств метаданных, хранящихся в результирующем наборе.
Другие советы
GetSchemaTable() считывает метаданные в результирующем наборе, возвращенном ADO.NET .
Из системных таблиц (например, syscolumns, sysobjects и т.д.) в каждой базе данных.