No existe una propiedad RecordCount que indique cuántos registros se han recuperado cuando usa la clase OleDbDataReader o SqlDataReader en Visual C#

Este artículo se publicó anteriormente con el número E308352
Para obtener una versión de este artículo para Microsoft Visual Basic .NET, vea 308050.

Este artículo hace referencia a los siguientes espacios de nombres de la Biblioteca de clases de Microsoft .NET Framework:
  • System.Data
  • System.Data.SqlClient
Síntomas
Cuando usa la clase OleDbDataReader o SqlDataReader, no existe una propiedad RecordCount que indique cuántos registros se han recuperado.
Causa
El objeto DataReader o el origen de datos back-end no suelen saber cuántos registros se han recuperado hasta que el último registro se envía al cliente.

Incluso un conjunto de registros ActiveX Data Objects (ADO) devuelve -1 para la propiedad RecordCount cuando utiliza un cursor de sólo avance para recuperar los datos. DataReader exhibe un comportamiento similar porque utiliza un cursor de sólo avance para recuperar las filas y columnas.
Solución
Como solución alternativa para este problema, utilice uno de los métodos siguientes:
  • Cuente los registros a medida que atraviesa el lector.
  • Ejecute primero una consulta SELECT COUNT (*). Observe que esta consulta puede estar anticuada cuando termina de leer los datos.
Estado
Este comportamiento es una característica del diseño de la aplicación.
Más información

Pasos para reproducir este comportamiento

  1. Inicie Microsoft Visual Studio .NET.
  2. Cree una nueva aplicación para Windows en Visual C# .NET. De manera predeterminada se creará Form1.
  3. Asegúrese de que el proyecto contiene una referencia al espacio de nombres System.Data y, si no es así, agregue una.
  4. Agregue un botón Command a Form1 y cambie sus propiedades Name y Text a btnTest.
  5. Utilice la instrucción using de los espacios de nombres System y System.Data para que no se le pida que califique las declaraciones de esos espacios de nombres más adelante en el código.
    using System;using System.Data;using System.Data.SqlClient;					
  6. Vuelva a la vista Formulario y haga doble clic en btnTest para agregar el controlador de eventos de clic. Agregue el código siguiente al controlador:
        String myConnString =     "User ID=sa;password=sa;Initial Catalog=pubs;Data Source=mySQLServer";    String mySelectQuery  = "SELECT * FROM Authors";    SqlConnection myConnection = new SqlConnection(myConnString);    SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection);    myConnection.Open();    SqlDataReader myReader ;    myReader = myCommand.ExecuteReader();    int RecordCount = 0;    try    {	while (myReader.Read())	{	    RecordCount++;	}	if (RecordCount == 0)            MessageBox.Show("No data returned");	else	    MessageBox.Show("Number of Records returned: " + RecordCount);    }    catch (Exception ex)    {	MessageBox.Show(ex.ToString());    }        finally    {	myReader.Close();	myConnection.Close();    }					
  7. Modifique la cadena de conexión (myConnString) de acuerdo con su entorno.
  8. Guarde el proyecto.
  9. En el menú Depurar, haga clic en Iniciar para ejecutar el proyecto.
  10. Haga clic en el botón. Observe que puede ver el recuento de registros.
Referencias
Para obtener más información al respecto, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
194973 ADO: Recordcount puede devolver -1
Propiedades

Id. de artículo: 308352 - Última revisión: 05/22/2007 18:38:03 - Revisión: 3.5

Microsoft ADO.NET 2.0, Microsoft ADO.NET 1.0, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# 2005

  • kbtshoot kbnofix kbprb kbsqlclient kbsystemdata KB308352
Comentarios