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

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.
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.
kbreadme
Propriétés

ID d'article : 307512 - Dernière mise à jour : 02/24/2014 03:30:36 - Révision : 2.0

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

  • kbnosurvey kbarchive kbbug kbreadme kbpending KB307512
Commentaires