BOGUE : La méthode GetSchemaTable() de l'objet SqlDataReader retourne un nom de colonne incorrect

Traductions disponibles Traductions disponibles
Numéro d'article: 307512 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F307512
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

Symptômes

La méthode GetSchemaTable de l'objet SqlDataReader retourne des colonnes ainsi que les propriétés BaseServerName et BaseCatalogName. Néanmoins, SqlDataReader.GetSchemaTable n'est sensé retourner que BaseCatalogName.

Cause

Outre les colonnes décrites dans la documentation du Kit de développement Microsoft .NET Framework SDK des bibliothèques de classe, SqlDataReader.GetSchemaTable retourne également une colonne appelée BaseServerName correspondant au nom de l'instance de Microsoft SQL Server utilisée par SqlDataReader. BaseServerName figure avant BaseCatalogName dans la table DataTable décrivant les métadonnées de la colonne.

Résolution

Étant donné que ce problème ne se produit pas avec l'objet OleDbDataReader, vous pouvez utiliser cet objet afin d'obtenir les informations sur la table SchemaTable.

Statut

Microsoft a confirmé l'existence de ce bogue dans les produits Microsoft répertoriés dans la section "Liste des produits concernés par cet article".

Plus d'informations

Procédure pour reproduire le comportement

Utilisation de Visual Basic .NET

  1. Démarrez Microsoft Visual Studio .NET, puis créez un nouveau projet d'application de la console Visual Basic.
  2. Ajoutez le code suivant au-dessus du module Module1 :
    Imports System.Data.SqlClient
  3. Ajoutez le code suivant à la procédure Sub Main() :
    Dim cnNwind As New SqlConnection("Data Source=ServerName;user id=username;" & _
                                     "Password=password;Initial Catalog=Northwind;")
            Dim cmd As New SqlCommand("Select * from Customers", cnNwind)
            cnNwind.open()
            
            Dim dr As SqlDataReader
            dr = cmd.ExecuteReader
            Dim i As Integer
            For i = 0 To dr.GetSchemaTable.Columns.Count - 1
            
            System.Console.WriteLine(dr.GetSchemaTable.Columns(i).ColumnName)
            
            Next
            System.Console.Read()        
            dr.Close()
            cnNwind.Close()
  4. Modifiez la chaîne de connexion en fonction de votre serveur Microsoft SQL Server.
  5. Appuyez sur la touche F5 pour compiler et exécuter le projet. Notez que l'ensemble des colonnes dans SchemaTable apparaissent dans la fenêtre de la Console. Remarquez également que BaseServerName apparaît avant BaseCatalogName.

Utilisation de Visual C# .NET

  1. Démarrez Microsoft Visual Studio .NET, puis créez un nouveau projet d'application de la console Visual C#.
  2. Ajoutez le code suivant à Class1 avant l'espace de noms ConsoleApplication1 :
    using System.Data;
    using System.Data.SqlClient;
  3. Ajoutez le code suivant à la procédure static void Main(string[] args) :
    SqlConnection cnNwind = new SqlConnection("Data Source=servername;user id=username;
                                              Password=password;Initial Catalog=Northwind;");
            SqlCommand cmd = new SqlCommand("Select * from Customers", cnNwind);
            
    	cnNwind.Open();
    	
            SqlDataReader dr ;
            
    			dr = cmd.ExecuteReader();
    			DataTable dt = dr.GetSchemaTable();
    				for (int i=0;i<dt.Columns.Count;i++)
    				{
    					System.Console.WriteLine(dt.Columns[i]);
    				}
    				System.Console.Read();
                                    dr.Close();
                                    cnNwind.Close();
    			
  4. Modifiez la chaîne de connexion en fonction de votre serveur Microsoft SQL Server.
  5. Appuyez sur la touche F5 pour compiler et exécuter le projet. Notez que l'ensemble des colonnes dans SchemaTable apparaissent dans la fenêtre de la Console. Remarquez également que BaseServerName apparaît avant BaseCatalogName.

Utilisation de Visual C++ .NET

  1. Démarrez Microsoft Visual Studio .NET, puis créez un nouveau projet d'application managée de la console Visual C++.
  2. Ajoutez le code suivant avant la procédure int _tmain(void) :
    #using <System.dll>
    #using <System.Data.dll>
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::SqlClient ;
  3. Ajoutez le code suivant avant la procédure int -tmain(void) :
    SqlConnection *cnNwind = new SqlConnection("Data Source=servername;user id=username;
                                               Password=password;Initial Catalog=Northwind;");
        SqlCommand *cmd = new SqlCommand("Select * from Customers", cnNwind);
    		 cnNwind->Open();
    		 
            SqlDataReader *dr ;
            
    				dr = cmd->ExecuteReader();
    				DataTable *dt = dr->GetSchemaTable();
    				int i;
    				for (i=0;i <dt-> Columns->Count;i++)
    				{
                                     Console::WriteLine(dt->Columns->Item [i]);
    				}
    				System::Console::Read();
    				dr->Close();
    				cnNwind->Close();
    				
    				return 0;
  4. Modifiez la chaîne de connexion en fonction de votre serveur Microsoft SQL Server.
  5. Appuyez sur la touche F5 pour compiler et exécuter le projet. Notez que l'ensemble des colonnes dans SchemaTable apparaissent dans la fenêtre de la Console. Remarquez également que BaseServerName apparaît avant BaseCatalogName.

Propriétés

Numéro d'article: 307512 - Dernière mise à jour: lundi 24 février 2014 - Version: 2.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO .NET (inclus dans .NET Framework)
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual C++ .NET 2002 Initiation
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft .NET Framework Software Development Kit 1.0
Mots-clés : 
kbnosurvey kbarchive kbbug kbreadme kbpending KB307512
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com