Pregunta

Estoy intentando rellenar un DataTable, para construir un LocalReport, 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. 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 intentado depurarlo para encontrar dónde está el problema y me quedé atascado en

 dt.Load(cmd.ExecuteReader());

Cuando me he dado cuenta de que el DataReader contiene dos registros, pero el DataTable solo contiene uno. Por accidente, agregué una cláusula ORDER BY a la consulta y noté que esta vez el informe se mostraba correctamente.

Aparentemente, el DataReader contiene dos filas, pero el DataTable solo lee ambas si la cadena de consulta SQL contiene un ORDER BY (de lo contrario, solo lee la última). ¿Alguien puede explicar por qué sucede esto y cómo puede solucionarse?

Editar: Cuando publiqué la pregunta por primera vez, dije que se estaba saltando la primera fila; más tarde, me di cuenta de que en realidad solo se leía la última fila y, en consecuencia, he editado el texto (en ese momento todos los registros se agruparon en dos filas y parecía que se saltaba la primera cuando en realidad solo mostraba la última). Esto puede deberse al hecho de que no tenía un identificador único con el cual distinguir entre las filas devueltas por MySQL, por lo que al agregar la instrucción ORDER BY se creaba un identificador único para cada fila.
Esto es solo una teoría y no tengo nada que la respalde, pero todas mis pruebas parecen conducir al mismo resultado.

¿Fue útil?

Solución

Tuve el mismo problema. Tomé una pista de su blog y coloqué la cláusula ORDER BY en la consulta para que pudieran formar la clave única para todos los registros devueltos por consulta. Se solucionó el problema. Un poco raro.

Otros consejos

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 principal en los datos subyacentes. Si lees la documentación detenidamente, esto se vuelve obvio, aunque no está expresado de manera muy explícita.

Si tienes una columna llamada " id " Parece que usa eso (que me lo arregló). De lo contrario, parece que solo usa 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, sugeriría que intente establecer explícitamente la (s) columna (s) de clave principal de la tabla de datos antes de cargar el datareader.

En caso de que alguien tenga un problema similar al de los cancerígenos, estaba usando If DataReader.Read ... en lugar de If DataReader.HasRows para verificar la existencia antes de llamar dt.load (DataReader) Doh!

Tenía el mismo problema. Es porque la clave principal en todas las filas es la misma. Probablemente es lo que se usa para generar los resultados, y por lo tanto, solo sobrescribe la misma fila una y otra vez.

Datatables.Load apunta al método de relleno para entender cómo funciona. Esta página indica que es clave primaria. Dado que las claves primarias solo pueden aparecer una vez y se usan como claves para la fila ...

" La operación de Relleno luego 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 de relleno normalmente crea solo metadatos de nombre de columna. Sin embargo, si la propiedad MissingSchemaAction se establece en AddWithKey, también se crean las claves y restricciones primarias apropiadas. & Quot; (http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

Encontré este problema hoy.

Nada en este hilo lo solucionó, desafortunadamente, ¡pero luego envolví mi consulta SQL en otra declaración SELECT y funcionó!

Por ejemplo:

SELECT * FROM (
    SELECT ..... < YOUR NORMAL SQL STATEMENT HERE />
) allrecords

Extraño ....

No usar

dr.Read()

Porque mueve el puntero a la siguiente fila. Quita esta línea, espero que funcione.

¿Puede capturar la consulta real que se está ejecutando desde el analizador 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? MSDN Docs

Sé que esta es una pregunta antigua, pero para mí, pensar que funcionó al consultar una base de datos de acceso y al darse cuenta de que faltaba una fila de la consulta, fue cambiar lo siguiente: -

    if(dataset.read())  - Misses a row.

    if(dataset.hasrows) - Missing row appears.

¿No está seguro de por qué falta la fila en la tabla de datos, es posible que necesite cerrar el lector? En cualquier caso, aquí es cómo normalmente cargo los informes y funciona cada vez ...

        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 por ver si todavía sucede.

En mi caso, ni ORDER BY, ni dt.AcceptChanges () está funcionando. No sé por qué es ese problema para. Tengo 50 registros en la base de datos, pero solo muestra 49 en la base de datos. omitiendo la primera fila, y si solo hay un registro en datareader no muestra nada en absoluto.

que bizzareeee .....

¿Ha intentado llamar a dt.AcceptChanges () después de la llamada a dt.Load (cmd.ExecuteReader ()) para ver si eso ayuda?

Sé que esta es una pregunta antigua, pero estaba experimentando el mismo problema y ninguna de las soluciones mencionadas aquí me ayudó.

En mi caso, el uso de un alias en la columna que se utiliza como PrimaryKey solucionó el problema.

Entonces, en lugar de

SELECT a
     , b
FROM table

He utilizado

SELECT a as gurgleurp
     , b
FROM table

y funcionó.

Tuve el mismo problema ... no usé dataReader.Read () en absoluto ... llevará el puntero a la siguiente fila. En su lugar, use directamente datatable.load (dataReader).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top