Domanda

Sto tentando di popolare una DataTable, per creare un LocalReport, utilizzando quanto segue:

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);

Ad un certo punto ho notato che il rapporto era incompleto e mancava un record. Ho modificato alcune condizioni in modo che la query restituisca esattamente due righe e ... sorpresa : il rapporto mostra solo una riga anziché due. Ho provato a eseguire il debug per trovare dov'è il problema e mi sono bloccato su

 dt.Load(cmd.ExecuteReader());

Quando ho notato che il DataReader contiene due record ma il DataTable ne contiene solo uno. Per caso, ho aggiunto una query ORDER BY alla query e ho notato che questa volta il rapporto è stato visualizzato correttamente.

Apparentemente, DataReader contiene due righe ma DataTable le legge solo se la stringa di query SQL contiene un ORDER BY (altrimenti legge solo l'ultima). Qualcuno può spiegare perché questo sta accadendo e come può essere corretto?

Modifica Quando ho pubblicato la domanda per la prima volta, ho detto che stava saltando la prima riga; in seguito mi sono reso conto che in realtà leggeva solo l'ultima riga e ho modificato il testo di conseguenza (a quel tempo tutti i record erano raggruppati in due righe e sembrava saltare il primo quando in realtà mostrava solo l'ultimo). Ciò può essere causato dal fatto che non aveva un identificatore univoco in base al quale distinguere tra le righe restituite da MySQL, quindi l'aggiunta dell'istruzione ORDER BY ha causato la creazione di un identificatore univoco per ogni riga.
Questa è solo una teoria e non ho nulla per supportarla, ma tutti i miei test sembrano portare allo stesso risultato.

È stato utile?

Soluzione

Ho avuto lo stesso problema. Ho preso suggerimenti dal tuo blog e ho inserito la clausola ORDER BY nella query in modo che potessero formare insieme la chiave univoca per tutti i record restituiti dalla query. Ha risolto il problema. Un po 'strano.

Altri suggerimenti

la domanda ha diversi anni, ma non avevo trovato una risposta decente, a parte la soluzione sopra menzionata.

Dopo aver armeggiato un po 'ho scoperto che il metodo DataTable.Load prevede una colonna chiave primaria nei dati sottostanti. Se leggi attentamente la documentazione, questo diventa ovvio, sebbene non sia dichiarato in modo molto esplicito.

Se hai una colonna denominata " id " sembra usare quello (che l'ha riparato per me). Altrimenti sembra solo usare la prima colonna, sia essa univoca o meno, e sovrascrive le righe con lo stesso valore in quella colonna mentre vengono lette. Se non hai una colonna denominata " id " e la tua prima colonna non è unica, ti suggerirei di provare a impostare esplicitamente le colonne chiave primaria del datatable prima di caricare il datareader.

Nel caso in cui qualcuno abbia un problema simile a un Canceriens, stavo usando If DataReader.Read ... invece di If DataReader.HasRows per verificare l'esistenza prima di chiamare dt.load (DataReader) Doh!

Aveva lo stesso problema. È perché la chiave primaria su tutte le righe è la stessa. Probabilmente è ciò che viene utilizzato per digitare i risultati, e quindi sta semplicemente sovrascrivendo la stessa riga più volte.

Datatables.Load punta al metodo di riempimento per capire come funziona. Questa pagina afferma che è a conoscenza della chiave primaria. Poiché le chiavi primarie possono verificarsi una sola volta e vengono utilizzate come chiavi per la riga ...

" L'operazione Fill aggiunge quindi le righe agli oggetti DataTable di destinazione nel DataSet, creando gli oggetti DataTable se non esistono già. Quando si creano oggetti DataTable, l'operazione di riempimento crea normalmente solo metadati con nome di colonna. Tuttavia, se la proprietà MissingSchemaAction è impostata su AddWithKey, vengono anche creati i vincoli e le chiavi primarie appropriate. & Quot; (Http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

Oggi ho riscontrato questo problema.

Niente in questo thread lo ha purtroppo risolto, ma poi ho racchiuso la mia query SQL in un'altra istruzione SELECT e funziona!

Esempio:

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

Strano ....

Non usare

dr.Read()

Perché sposta il puntatore sulla riga successiva. Rimuovi questa linea spero che funzionerà.

Puoi afferrare la query effettiva in esecuzione dal profiler SQL e provare a eseguirla? Potrebbe non essere quello che ti aspettavi.

Si ottiene lo stesso risultato quando si utilizza un SqlDataAdapter.Fill (dataTable)?

Hai provato diversi comportamenti di comando sul lettore? Documenti MSDN

So che questa è una vecchia domanda, ma per me il pensiero che ha funzionato durante la query di un database di accesso e notando che mancava 1 riga dalla query, era di modificare quanto segue: -

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

    if(dataset.hasrows) - Missing row appears.

Non sai perché ti manca la riga nel datatable, è possibile che tu debba chiudere il lettore? In ogni caso, ecco come carico normalmente i report e funziona ogni volta ...

        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 di vedere se succede ancora.

Nel mio caso né ORDER BY né dt.AcceptChanges () funzionano. Non so perché sia ??questo problema. Sto avendo 50 record nel database ma mostra solo 49 nel datatable. saltando la prima riga, e se c'è solo un record in Datareader non mostra nulla.

che bizzareeee .....

Hai provato a chiamare dt.AcceptChanges () dopo la chiamata dt.Load (cmd.ExecuteReader ()) per vedere se aiuta?

So che questa è una vecchia domanda, ma stavo riscontrando lo stesso problema e nessuna delle soluzioni alternative menzionate qui ha aiutato.

Nel mio caso, l'utilizzo di un alias sulla colonna utilizzato come PrimaryKey ha risolto il problema.

Quindi, invece di

SELECT a
     , b
FROM table

Ho usato

SELECT a as gurgleurp
     , b
FROM table

e ha funzionato.

Ho avuto lo stesso problema .. non ho usato affatto dataReader.Read () .. porterà il puntatore alla riga successiva. Utilizza invece direttamente datatable.load (dataReader).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top