while - .NET DataTable omite filas en Load(DataReader)
using sqldatareader vb net (13)
Intento poblar una DataTable para construir un Informe Local, usando lo siguiente:
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = new MySqlConnection(Properties.Settings.Default.dbConnectionString);
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT ... LEFT JOIN ... WHERE ..."; /* query snipped */
// prepare data
dataTable.Clear();
cn.Open();
// fill datatable
dt.Load(cmd.ExecuteReader());
// fill report
rds = new ReportDataSource("InvoicesDataSet_InvoiceTable",dt);
reportViewerLocal.LocalReport.DataSources.Clear();
reportViewerLocal.LocalReport.DataSources.Add(rds);
En un momento noté que el informe estaba incompleto y faltaba un registro. Cambié algunas condiciones para que la consulta devuelva exactamente dos filas y ... sorpresa : el informe muestra solo una fila en lugar de dos. Intenté depurarlo para encontrar dónde está el problema y me quedé atrapado en
dt.Load(cmd.ExecuteReader());
Cuando me di cuenta de que el DataReader
contiene dos registros, el DataTable
contiene solo uno. Por accidente, agregué una cláusula ORDER BY
a la consulta y me di cuenta de que esta vez el informe se mostraba correctamente.
Aparentemente, el DataReader contiene dos filas, pero DataTable solo las lee a ambas si la cadena de consulta SQL contiene un ORDER BY
(de lo contrario, solo lee el último). ¿Alguien puede explicar por qué está sucediendo esto y cómo se puede solucionar?
Editar: Cuando publiqué la pregunta por primera vez, dije que saltaba la primera fila; más tarde me di cuenta de que solo leía la última fila y edité el texto en consecuencia (en ese momento todos los registros estaban agrupados en dos filas y parecía omitir el primero cuando en realidad solo mostraba el último). Esto puede deberse al hecho de que no tenía un identificador único para distinguir entre las filas devueltas por MySQL, por lo que agregar la instrucción ORDER BY
hizo que creara un identificador único para cada fila.
Esta es solo una teoría y no tengo nada para apoyarla, pero todas mis pruebas parecen conducir al mismo resultado.
¿Has intentado llamar a dt.AcceptChanges()
después de la dt.Load(cmd.ExecuteReader())
para ver si eso ayuda?
¿Puedes tomar la consulta real que se ejecuta desde el generador de perfiles de SQL e intentar ejecutarla? Puede que no sea lo que esperabas.
¿Obtiene el mismo resultado cuando usa un SqlDataAdapter.Fill (dataTable)?
¿Has probado diferentes comportamientos de comando en el lector? Documentos de MSDN
En caso de que alguien tenga un problema similar al de canceriens, estaba usando If DataReader.Read
... en lugar de If DataReader.HasRows
para verificar existencia antes de llamar a dt.load(DataReader)
Doh!
En mi caso, ni ORDER BY ni dt.AcceptChanges () están funcionando. No sé por qué es ese problema. Tengo 50 registros en la base de datos, pero solo muestra 49 en la tabla de datos. omitiendo la primera fila, y si solo hay un registro en el lector de datos, no muestra nada en absoluto.
qué bizzareeee .....
Encontré este problema hoy.
Nada en este hilo lo arregló por desgracia, pero luego envolví mi consulta SQL en otra declaración SELECT y ¡funciona!
P.ej:
SELECT * FROM (
SELECT ..... < YOUR NORMAL SQL STATEMENT HERE />
) allrecords
Extraño....
No estoy seguro de por qué te falta la fila en la tabla de datos. ¿Es posible que necesites cerrar el lector? En cualquier caso, así es como normalmente cargo los informes y funciona siempre ...
Dim deals As New DealsProvider()
Dim adapter As New ReportingDataTableAdapters.ReportDealsAdapter
Dim report As ReportingData.ReportDealsDataTable = deals.GetActiveDealsReport()
rptReports.LocalReport.DataSources.Add(New ReportDataSource("ActiveDeals_Data", report))
Curioso para ver si todavía sucede.
No usar
dr.Read()
Porque mueve el puntero a la siguiente fila. Elimine esta línea, espero que funcione.
Sé que esta es una vieja pregunta, pero estaba experimentando el mismo problema y ninguna de las soluciones mencionadas aquí me ayudó.
En mi caso, usar un alias en la columna que se usa como PrimaryKey
resolvió el problema.
Entonces, en lugar de
SELECT a
, b
FROM table
solía
SELECT a as gurgleurp
, b
FROM table
Y funcionó.
Sé que esta es una vieja pregunta, pero para mí el hecho de que funcionó mientras consultaba una base de datos de acceso y me di cuenta de que faltaba 1 fila de la consulta, fue para cambiar lo siguiente:
if(dataset.read()) - Misses a row.
if(dataset.hasrows) - Missing row appears.
Tenía el mismo problema. Es porque la clave principal en todas las filas es la misma. Probablemente sea lo que se está utilizando para clavear los resultados, y por lo tanto, solo sobrescribe la misma fila una y otra vez.
Datatables.Load apunta al método de llenado para comprender cómo funciona. Esta página indica que es consciente de la clave primaria. Dado que las claves primarias solo pueden aparecer una vez y se utilizan como claves para la fila ...
"La operación Rellenar agrega las filas a los objetos DataTable de destino en el DataSet, creando los objetos DataTable si aún no existen. Al crear objetos DataTable, la operación Relleno normalmente crea solo metadatos de nombre de columna. Sin embargo, si se establece la propiedad MissingSchemaAction para AddWithKey, también se crean claves primarias y restricciones apropiadas ". (http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)
Tuve el mismo problema ... no usé dataReader.Read () en absoluto ... tomará el puntero a la siguiente fila. En su lugar, use directamente datatable.load (dataReader).
Tuve el mismo problema. Tomé una pista de su blog y puse la cláusula ORDER BY en la consulta para que pudieran formar juntas la clave única para todos los registros devueltos por la consulta. Solucionó el problema. Algo raro.
la pregunta tiene varios años, pero no encontré una respuesta decente, aparte de la solución anterior.
Después de juguetear un poco encontré que el método DataTable.Load espera una columna de clave primaria en los datos subyacentes. Si lee la documentación detenidamente, esto se vuelve obvio, aunque no se menciona de manera muy explícita.
Si tiene una columna llamada "id", parece usar eso (que me lo arregló). De lo contrario, simplemente parece usar la primera columna, ya sea única o no, y sobrescribe las filas con el mismo valor en esa columna a medida que se leen. Si no tiene una columna llamada "id" y su primera columna no es única, le sugiero que intente establecer explícitamente la (s) columna (s) de clave principal de la tabla de datos antes de cargar el lector de datos.