2009-10-15 18 views
6
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?

Odpowiedz

6

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.

-1

Z tabel systemowych (np. Syscolumns, sysobjects itp.) W każdej bazie danych.

+0

Czy tak jest zawsze, czy też zależy to od tego, który dostawca OLE DB jest używany? –

+2

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

+0

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

2

Funkcja GetSchemaTable() odczytuje metadane zestawu wyników zwróconego przez ADO.NET.