OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTable dataTable = oleDbDataReader.GetSchemaTable();
Jak działa GetSchemaTable()
?Jak działa funkcja GetSchemaTable()?
Skąd bierze informacje w RDBMS?
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTable dataTable = oleDbDataReader.GetSchemaTable();
Jak działa GetSchemaTable()
?Jak działa funkcja GetSchemaTable()?
Skąd bierze informacje w RDBMS?
Realizacja IDataReader.GetSchemaTable()
zależy od dostawcy - więc będzie się różnić. Możesz pisać własnych dostawców i robić to w dowolny sposób.
Szczerze mówiąc, jest to zły projekt w ramach - nigdy nie powinieneś mieć metod interfejsu, które zwracają niezaszyfrowane DataTable
lub DataSet
, ponieważ wynik ten może zawierać cokolwiek. Kinda pokonuje punkt ograniczający go za pomocą interfejsu w pierwszej kolejności: „trzeba mieć metodę, która zwraca DataTable
ale nie obchodzi mnie, co wiersze lub kolumny ma”
Nawet jeśli dostawca jest SQL GetSchemaTable()
nie wraca do wersji [syscolumns]
lub [sysobjects]
. Byłoby to dodatkowe wywołanie DB, wymagałoby dodatkowych uprawnień i nie działało tak, ponieważ zestaw wyników nie musi odzwierciedlać żadnych obiektów w DB.
Nie jestem pewien, ale spodziewam się, że ogromna większość implementacji IDataReader.GetSchemaTable()
będzie czytać niektóre właściwości metadanych przechowywanych w zestawie wyników.
Z tabel systemowych (np. Syscolumns, sysobjects itp.) W każdej bazie danych.
Funkcja GetSchemaTable() odczytuje metadane zestawu wyników zwróconego przez ADO.NET.
Czy tak jest zawsze, czy też zależy to od tego, który dostawca OLE DB jest używany? –
To źle. Wynik może być dynamiczny, użytkownik może nie mieć uprawnień do przeglądania obiektów sysobject (WIDOK DEFINICJA w MSSQL 2005+) itp. – VladV
Załóżmy, że twój czytnik znalazł się w teście "WYBIERZ", 1? Można nazwać 'GetSchemaTable()' na zestawie wyników 'IDataReader' i zdecydowanie nie byłoby sprawdzanie' [sysobjects] '. – Keith