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

Seleccione idioma Seleccione idioma
Id. de artículo: 307512 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

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 .

Propiedades

Id. de artículo: 307512 - Última revisión: lunes, 24 de febrero de 2014 - Versión: 1.18
La información de este artículo se refiere a:
  • 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
Palabras clave: 
kbnosurvey kbarchive kbmt kbtshoot kbvs2002sp1sweep kbbug kbpending kbreadme kbsqlclient kbsystemdata KB307512 KbMtes
Traducción automática
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

Enviar comentarios

 

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