2011-12-06 16 views
5

Me enfrento a este problema. Tengo un procedimiento almacenado que devuelve 6 filas cuando lo ejecuto.¿Por qué IDataReader pierde una fila?

Pero cuando estoy recuperando las filas en mi aplicación usando ExecuteReader, solo devuelve 5 filas. ¿Por qué está perdiendo una fila?

Mi procedimiento almacenado consiste en 5 estados de la Unión que se están llenas de una sola tabla:

dbase.AddInParameter(cmd, "@LoginUser", DbType.String, UserID); 

    try 
    { 
     using (IDataReader dr = dbase.ExecuteReader(cmd)) 
     if (dr.Read()) 
     { 
     dt = new DataTable("DashBoard"); 
     dt.Load(dr); 
     } 
    } 

dbase es mi objeto de base de datos. Y cmd es el SqlCommand utilizado para llamar al procedimiento almacenado.

UserID es parámetro se pasa

almacenados código de procedimiento es:

ALTER PROCEDURE [dbo].[USP_ViewAdminDashBoard](@LoginUser varchar(75)) 
    -- Add the parameters for the stored procedure here 
AS 
BEGIN 

    SET NOCOUNT ON; 
    SET DATEFORMAT DMY; 
    DECLARE @LastLoginDate as DateTime 

     Select @LastLoginDate = dbo.UDF_GetLastLoginByUser(@LoginUser) 
    Select 'Last Login Date', convert(varchar(12),@LastLoginDate,105) 

    Union 
    Select 'Nos. Records pending for Upload' as Title, convert(varchar(5),COUNT(s.BatchID)) Total from dbo.BREGISTRATIONENTRY s, Dbo.TBL_iBATCH B 
    where B.BatchID = s.BatchID And b.Forwarded = 0 and b.isBatchClosed = 1 
END 
+3

por favor muestre su código. –

+1

Por favor, muéstrenos el procedimiento almacenado también. – Fischermaen

Respuesta

12

Su primera dr.Read está avanzando a la primera fila. El DataTable.Load está leyendo las filas restantes, pero no la primera fila

Uso HasRows para probar la existencia y no utilice Read antes de la DataTable.Load

Editar:

sólo tiene que cargar el DataTable sin probar primero : luego prueba en DataTable. No hay HasRows en la interfaz IDataReader.

+0

Gracias Pal echo de menos los básicos – joshua

+1

Desafortunadamente, 'IDataReader' no tiene' HasRows', así que supongo que puedes simplemente crear 'DataTable' y comprobar si el resultado tiene filas en su lugar. –

+0

@ C.Evenhuis: ah sí, actualizará – gbn

0

IDataReader es un lector avanzado, significa que cuando lee una fila, esa fila se eliminará del lector y ya no podrá obtenerla del lector.

+0

Ese es un comportamiento básico de un lector – joshua

0

joshua también tengo este problema al usar la biblioteca de la empresa más de dos veces, incluso uso el mismo código escrito pero ambas veces encontré un problema en el procedimiento de la tienda debe haber una selección incorrecta en la consulta o cualquier otra cosa que db servidor no detecta y lo resuelvo y mi IDataReader seleccionar todas las filas y también utilizan misma manera que sugiera por 'GBN' usando (dr = IDataReader oDb.ExecuteReader (p_oDbCommand)) {

   if (dr != null) 
       { 

        ds.Tables[0].Load(dr); 
       } 

      } 
      return dt; 
Cuestiones relacionadas