Vraag .NET DataTable slaat rijen over bij Load (DataReader)


Ik probeer een DataTable te vullen om een ​​LocalReport te maken met behulp van het volgende:

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

Op een gegeven moment merkte ik dat het rapport onvolledig was en er één record ontbrak. Ik heb een paar voorwaarden gewijzigd zodat de query precies twee rijen retourneert en ... verrassing: Het rapport toont slechts één rij in plaats van twee. Ik heb geprobeerd het te debuggen om te achterhalen waar het probleem zit en ik ben blijven steken

 dt.Load(cmd.ExecuteReader());

Wanneer ik heb gemerkt dat de DataReader bevat twee records, maar de DataTable bevat slechts één. Per ongeluk heb ik een toegevoegd ORDER BY clausule aan de vraag en merkte op dat dit keer het rapport correct vertoonde.

Blijkbaar bevat de DataReader twee rijen, maar de gegevenstabel leest ze allebei als de SQL-queryreeks een bevat ORDER BY (anders leest alleen de laatste). Kan iemand uitleggen waarom dit gebeurt en hoe het kan worden opgelost?

Bewerk: Toen ik de vraag voor het eerst plaatste, zei ik dat het de eerste rij overslaat; later realiseerde ik me dat het eigenlijk alleen de laatste rij heeft gelezen en dat ik de tekst dienovereenkomstig heb bewerkt (op dat moment waren alle records in twee rijen gegroepeerd en het leek de eerste te zijn overgeslagen toen deze alleen de laatste keer liet zien). Dit kan worden veroorzaakt door het feit dat het geen unieke ID heeft om een ​​onderscheid te maken tussen de rijen die door MySQL zijn geretourneerd, dus het toevoegen van de ORDER BY Deze instructie heeft ervoor gezorgd dat een unieke ID voor elke rij is gemaakt.
Dit is slechts een theorie en ik heb niets om het te ondersteunen, maar al mijn tests lijken tot hetzelfde resultaat te leiden.


19
2017-10-23 11:41


oorsprong


antwoorden:


Ik had hetzelfde probleem. Ik nam hint van je blog en plaatste de ORDER BY-component in de query, zodat ze samen de unieke sleutel konden vormen voor alle records die door de query werden geretourneerd. Het loste het probleem op. Beetje vreemd.


2
2018-01-17 07:59



de vraag is al een paar jaar oud, maar ik had geen goed antwoord gevonden, behalve de bovengenoemde oplossing.

Na wat gedoe rondgedraaid te hebben, merkte ik dat de DataTable.Load-methode een kolom met primaire sleutels verwacht in de onderliggende gegevens. Als je de documentatie zorgvuldig leest, wordt dit duidelijk, hoewel het niet expliciet wordt vermeld.

Als je een kolom hebt met de naam "id", lijkt het die te gebruiken (die het voor mij repareerde). Anders lijkt het gewoon de eerste kolom te gebruiken, ongeacht of deze uniek is of niet, en worden rijen met dezelfde waarde in die kolom overschreven terwijl ze worden gelezen. Als u geen kolom met de naam 'id' heeft en uw eerste kolom is niet uniek, stel ik voor om expliciet de kolomkol (len) met primaire sleutels van de datatabel in te stellen voordat de datareader wordt geladen.


6
2018-02-09 11:43



Had hetzelfde probleem. Het is omdat de primaire sleutel op alle rijen hetzelfde is. Het is waarschijnlijk wat er wordt gebruikt om de resultaten in te toetsen en daarom overschrijft het gewoon dezelfde rij steeds opnieuw.

Datatables.Load verwijst naar de vulmethode om te begrijpen hoe het werkt. Deze pagina geeft aan dat het de primaire sleutel is die op de hoogte is. Omdat primaire sleutels slechts één keer kunnen voorkomen en worden gebruikt als de toetsen voor de rij ...

"De Fill-bewerking voegt vervolgens de rijen toe aan de gewenste DataTable-objecten in de DataSet en maakt de DataTable-objecten als ze nog niet bestaan.Tijdens het maken van DataTable-objecten maakt de vulfunctie normaal gesproken alleen metagegevens over de kolomnaam, maar als de eigenschap MissingSchemaAction is ingesteld om AddWithKey toe te voegen, worden ook de juiste primaire sleutels en beperkingen gemaakt. " (Http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)


4
2018-02-28 20:51



Voor het geval dat iemand een soortgelijk probleem als kankerpatiënten heeft, gebruikte ik If DataReader.Read ... in plaats van If DataReader.HasRows om het bestaan ​​te controleren voordat je belt dt.load(DataReader) Doh!


4
2018-01-09 17:18



Kwam vandaag over dit probleem.

Niets in deze thread repareerde het helaas, maar toen sloeg ik mijn SQL-query in een andere SELECT-instructie en het werkt!

bv:

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

Vreemd....


4
2018-04-15 12:16



Niet gebruiken

dr.Read()

Omdat het de aanwijzer naar de volgende rij verplaatst. Verwijder deze regel hoop dat het zal werken.


3
2017-12-09 13:23



Kunt u de daadwerkelijke query die wordt uitgevoerd met de SQL-profiler, pakken en proberen uit te voeren? Het is misschien niet wat je verwachtte.

Krijgt u hetzelfde resultaat wanneer u een SqlDataAdapter.Fill (dataTable) gebruikt?

Heb je verschillende opdrachtgedragingen op de lezer geprobeerd? MSDN Docs


1
2017-10-23 11:52