Error: El método GetSchemaTable del objeto SqlDataReader devuelve el nombre de una columna incorrecta

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 307512
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Síntomas
El método GetSchemaTable del objeto SqlDataReader devuelve las columnas, la BaseServerName y BaseCatalogName propiedades. Sin embargo, SqlDataReader.GetSchemaTable sólo debe devolver BaseCatalogName .
Causa
Junto con las columnas que se describen en el Microsoft .NET Framework Class Library Software Development Kit (SDK) SqlDataReader.GetSchemaTable de documentación, devuelve una columna denominada BaseServerName . BaseServerName es el nombre de la instancia de Microsoft SQL Server que SqlDataReader utiliza. BaseServerName aparece antes BaseCatalogName en la DataTable que describe los metadatos de columna.
Solución
Ya que este problema no lugar con el objeto OleDbDataReader , puede utilizar OleDbDataReader para obtener la información en SchemaTable .
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.
Más información

Pasos para reproducir el comportamiento

Utilización de Visual Basic .NET

  1. Abra Microsoft Visual Studio .NET y cree un nuevo proyecto de aplicación de consola de Visual Basic.
  2. Agregue el código siguiente encima Module Module1:
    Imports System.Data.SqlClient					
  3. Agregue el código siguiente al procedimiento 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. Modifique la cadena de conexión según corresponda para Microsoft SQL Server.
  5. Presione la tecla F5 para compilar y ejecutar el proyecto. Observe que todas las columnas de la SchemaTable aparecen en la ventana de la consola. Además, observe que también aparece BaseServerName antes BaseCatalogName .

Utilizando Visual C# .NET

  1. Inicie Visual Studio .NET y cree un nuevo Visual C#. NET proyecto de aplicación de consola.
  2. Agregue el código siguiente a Class1 antes el espacio de nombres ConsoleApplication1 :
    using System.Data;using System.Data.SqlClient;					
  3. Agregue el código siguiente al procedimiento 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. Modifique la cadena de conexión de apropiado para su SQL equipo de Server.
  5. Presione la tecla F5 para compilar y ejecutar el proyecto. Observe que todas las columnas de la SchemaTable aparecen en la ventana de la consola. Además, observe que también aparece BaseServerName antes BaseCatalogName .

Mediante Visual C++. NET

  1. Inicie Visual Studio .NET y cree un Visual C++ .NET proyecto de aplicación administrada.
  2. Agregue el código siguiente antes del procedimiento de _tmain(void) int:
    #using <System.dll>#using <System.Data.dll>using namespace System;using namespace System::Data;using namespace System::Data::SqlClient ;					
  3. Agregue el código siguiente al procedimiento de-tmain(void) int:
    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. Modifique la cadena de conexión de apropiado para su SQL equipo de Server.
  5. Presione la tecla F5 para compilar y ejecutar el proyecto. Observe que todas las columnas de la SchemaTable aparecen en la ventana de la consola. Además, observe que también aparece BaseServerName antes BaseCatalogName .

Utilizando Visual J# .NET

  1. Abra Visual Studio.NET y cree un nuevo proyecto de aplicación de Visual J# con la consola.
  2. Agregue el código siguiente a class1:
    import System.Data.*;import System.Data.SqlClient.*;					
  3. Agregue el código siguiente a main:
    	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.get_Columns().get_Count(); i++)		{			DataColumnCollection dcc = dt.get_Columns();			System.Console.WriteLine(dcc.get_Item(i));		}		System.Console.Read();			dr.Close();		cnNwind.Close();					
  4. Modifique la cadena de conexión de apropiado para su SQL equipo de Server.
  5. Presione la tecla F5 para compilar y ejecutar el proyecto. Observe que todas las columnas de la SchemaTable aparecen en la ventana de la consola. Además, observe que también aparece BaseServerName antes BaseCatalogName .
kbreadme

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 307512 - Última revisión: 02/24/2014 20:22:56 - Revisión: 1.18

Microsoft ADO.NET 2.0, Microsoft ADO.NET (included with the .NET Framework), Microsoft ADO.NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard, Microsoft Visual C++ .NET 2003 Standard, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition, Microsoft .NET Framework 1.1, Microsoft .NET Framework 2.0, Microsoft Visual Basic 2005, Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C# 2005, Microsoft Visual J# 2005 Express Edition

  • kbnosurvey kbarchive kbmt kbtshoot kbvs2002sp1sweep kbbug kbpending kbreadme kbsqlclient kbsystemdata KB307512 KbMtes
Comentarios