2009-10-15 4 views
6
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo); 
DataTable dataTable = oleDbDataReader.GetSchemaTable(); 

Comment fonctionne GetSchemaTable()?Comment fonctionne GetSchemaTable()?

Où trouve-t-il ses informations dans le SGBDR?

Répondre

6

L'implémentation de IDataReader.GetSchemaTable() dépend du fournisseur - elle peut donc varier. Vous pouvez écrire vos propres fournisseurs et le faire comme vous le souhaitez. Pour être honnête, il y a un mauvais design dans le framework - vous ne devriez jamais avoir de méthodes d'interface qui retournent un DataTable ou DataSet non-typé car ce résultat pourrait contenir n'importe quoi. défaites un peu le point de le contraindre par une interface en premier lieu: « vous devez avoir une méthode qui retourne DataTable mais nous ne se soucient pas ce que les lignes ou les colonnes qu'il a »

Même si le fournisseur est SQL GetSchemaTable() ne retourne pas au [syscolumns] ou au [sysobjects]. Ce serait un appel DB supplémentaire, nécessiterait des privilèges supplémentaires et ne fonctionnerait pas de toute façon, car le jeu de résultats n'a besoin de refléter aucun objet dans la base de données.

Je ne suis pas certain, mais je m'attendrais à ce que la grande majorité des implémentations IDataReader.GetSchemaTable() lisent certaines propriétés des métadonnées contenues dans le jeu de résultats.

-1

À partir des tables système (par exemple, syscolumns, sysobjects, etc.) dans chaque base de données.

+0

Est-ce toujours le cas, ou cela dépend-il du fournisseur OLE DB utilisé? –

+2

C'est faux. Le résultat peut être dynamique, un utilisateur peut ne pas avoir l'autorisation d'afficher sysobjects (VIEW DEFINITION dans MSSQL 2005+), etc. – VladV

+0

Supposons que votre lecteur soit en travers de 'SELECT 'test', 1'? Vous pouvez appeler 'GetSchemaTable()' sur le jeu de résultats 'IDataReader' et ce n'est certainement pas vérifier [sysobjects]'. – Keith

2

GetSchemaTable() lit les métadonnées sur le jeu de résultats renvoyé par ADO.NET.