2012-07-28 34 views

Respuesta

15

utilizar este modelo para identificar y procesar la última fila de resultado:

if (reader.Read()) 
{ 
    var loop = true; 
    while (loop) 
    { 
     //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0); 
     loop = reader.Read(); 
     if (!loop) 
     { 
      //You are on the last record. Use values read in 1. 
      //Do some exceptions 
     } 
     else { 
      //You are not on the last record. 
      //Process values read in 1., e.g. myvar 
     } 
    } 
} 
+0

Gracias hombre, ¡esta es la mejor solución! – wben

+3

Solo tenemos que reemplazar if (reader.Read()) con if (reader.HasRow) – wben

+2

@wben En este caso no podrá leer valores al comienzo de la primera iteración. –

4

Aparte de "no hay otro después", no. Esto puede significar que necesita almacenar en búfer la fila, tratar de leer, y luego mirar los datos almacenados en el búfer si resultó ser el último.

En muchos casos, cuando los datos son moderados y está construyendo un modelo de objeto de algún tipo, puede simplemente mirar los datos construidos, es decir, hacer un List<T> de todas las filas al usar el lector, luego , mira la última fila en la lista.

+0

Sí, pero no quiero pasar dos bucles. – wben

+0

@wben si está en una lista, el bucle es increíblemente barato, o simplemente tiene acceso por indexador: 'list [list.Count-1]'. Por supuesto, el almacenamiento en memoria intermedia de la fila anterior es incluso más económico, pero más complejo. –

+0

@wben para aclarar las cosas, en la respuesta aceptada, donde dice "// 1. Aquí recupera los valores que necesita, por ejemplo, var myvar = reader.GetBoolean (0);", eso es lo que quiero decir con "buffer the Rema, intente leer, luego mire los datos almacenados en el búfer si resultó ser el último ". El ejemplo del código lo hace más claro, por supuesto. –

1

para iterar a través de la SqlDataReader:

SqlDataReader reader = ...; 
while(reader.Read()) 
{ 
    // the reader will contain the current row 
} 

No hay nada en la narración lector usted es la última fila. Si aún necesita llegar a la última fila, quizás almacenando los datos de la fila en una variable separada, puede obtener esos datos después de salir del ciclo.

Otras alternativas serían:

  • para obtener los datos en un conjunto de datos/DataTable
  • para almacenar los datos en una lista/matriz
  • recuperar los datos en orden inverso (reescribir la consulta) , de modo que la primera fila sea la que quieras.
+0

lector no es un enumerador no tiene MoveNext(). Primero debe solicitar enumerador, es decir, reader.GetEnumerator() –

+0

@RamanZhylich: Tiene razón. Debe ser reader.Read(). ¡Fijo! (editó la publicación) –

0

Otra posibilidad sería poner la información en el conjunto de datos.

Estás leyendo los datos con una consulta. Vamos a llamarlo q. Utilice esta consulta en su lugar:

select row_number() over (order by (select NULL)) as seqnum, 
     count(*) over (partition by null) as numrecs 
     q.*, 
from (<q>) q 
order by seqnum 

Ahora el último registro tiene SEQNUM = numrecs, que se puede probar en su aplicación.

Por cierto, esto supone que está recuperando los datos de una manera desordenada. Si desea realizar un pedido, coloque los criterios en la cláusula "ordenar por" para row_number().

0

Usted no puede hacer eso sin repetir siempre lo mismo es decir, ir a buscar el registro dos veces.Aquí es un método más corto

System.Data.DataTable dt = new System.Data.DataTable(); 
dt.Load(myDataReader); 
int recordCount = dt.Rows.Count; 
if(recordCount > 0) 
{ 
    if(dt.Rows[recordCount-1]["username"] == "wrong value") 
    throw new Exception("wrong value"); 
} 

Escribí esta fuera de la mano por lo que no está probado pero ese es el enfoque

Cuestiones relacionadas