Estoy intentando rellenar un DataTable, para construir un LocalReport, utilizando la siguiente:
.NET DataTable salta filas de Carga (DataReader)
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 me di cuenta de que el informe era incompleta y faltaba un registro. He cambiado algunas condiciones para que la consulta devuelva exactamente dos filas y ... sorpresa: el informe muestra solo una fila en lugar de dos. He tratado de depurarlo para encontrar dónde está el problema y me quedé atrapado en
dt.Load(cmd.ExecuteReader());
Cuando me he dado cuenta de que el DataReader
contiene dos registros, pero el DataTable
contiene sólo una. 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?
Edit: Cuando primero publiqué la pregunta, dije que se 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 al agregar la declaración ORDER BY
se creó un identificador único para cada fila.
Esto es solo una teoría y no tengo nada que lo respalde, pero todas mis pruebas parecen conducir al mismo resultado.
Mod + 1 porque he estado programando .NET y ADO.NET todos los días desde las primeras versiones beta y nunca supe que podría simplemente llamar a dt.Load() sin un DataAdapter. Suspiro. –
Situación similar aquí, Dave. Me enteré hace solo un mes. –
Hoy he publicado una pregunta duplicada (https://stackoverflow.com/questions/28676382/datatable-load-shows-less-rows-than-source-datareader) que finalmente se resolvió al ajustar la consulta. Quiero resaltar que esto ** solo ** ocurre en MYSQL. No ocurre en SQLSERVER. Creo que el problema no debe ser causado por el componente DataTable, sino que podría ser un error en el conector Mysql. ¿Alguna idea? –