Frage

Ich versuche, füllen Sie eine DataTable, um eine LocalReport, mit dem folgenden:

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

An einem Punkt bemerkte ich, dass der Bericht war unvollständig und es fehlte an einem Datensatz.Ich habe mich verändert ein paar Bedingungen, so dass die Abfrage zurückgeben würde, genau zwei Zeilen und... überraschung:Der Bericht zeigt nur eine Zeile anstelle von zwei.Ich habe versucht, zu Debuggen, um herauszufinden, wo das problem ist und ich habe am stecken

 dt.Load(cmd.ExecuteReader());

Als ich bemerkt habe, dass die DataReader enthält zwei Datensätze, sondern die DataTable enthält nur eine.Durch Zufall habe ich Hinzugefügt ORDER BY Klausel der Abfrage und bemerkte, dass dieser Bericht korrekt.

Offenbar, der DataReader enthält zwei Zeilen, aber der DataTable nur liest sowohl von Ihnen wenn die SQL-Abfrage enthält einen string ORDER BY (ansonsten liest nur die Letzte).Kann jemand erklären, warum dies geschieht und wie es behoben werden kann?

Edit: Wenn ich zuerst die Frage gepostet, ich sagte, es war das überspringen der ersten Zeile;später erkannte ich, dass es eigentlich nur Lesen der letzten Zeile und ich habe bearbeitet den text entsprechend (in dieser Zeit werden alle Datensätze wurden gruppiert in zwei Reihen und es schien, überspringen Sie die ersten, wenn es tatsächlich zeigte nur der Letzte).Dies kann durch die Tatsache verursacht, dass es nicht eine einheitliche Kennung haben, durch die die Unterscheidung zwischen den Zeilen zurückgegeben, die von MySQL, so dass das hinzufügen der ORDER BY Anweisung verursacht es, um einen eindeutigen Bezeichner für jede Zeile.
Dies ist nur eine Theorie und ich habe nichts, um ihn zu unterstützen, aber alle meine tests scheinen zum gleichen Ergebnis führen.

War es hilfreich?

Lösung

Ich hatte dasselbe Problem. Ich habe von Ihrem Blog andeuten und die ORDER BY-Klausel in der Abfrage setzen, so dass sie den eindeutigen Schlüssel für alle Datensätze durch Abfrage zurückgegeben zusammen konnten. Es löste das Problem. Irgendwie komisch.

Andere Tipps

Die Frage ist schon einige Jahre alt, aber ich hatte nicht eine anständige Antwort, andere als die oben genannten Problemumgehung gefunden.

Nach dem Hantieren ziemlich viel fand ich, dass die DataTable.Load Methode eine Primärschlüsselspalte in den zugrunde liegenden Daten erwartet. Wenn Sie die Dokumentation sorgfältig lesen, wird dies offensichtlich, obwohl es sehr explizit nicht angegeben ist.

Wenn Sie eine Spalte mit dem Namen „id“ es scheint, dass zu verwenden (was es für mich fest). es scheint, sonst nur die erste Spalte zu verwenden, ob es einzigartig ist oder nicht, und überschreibt Zeilen mit demselben Wert in dieser Spalte, wie sie gelesen werden. Wenn Sie nicht über eine Spalte „id“ und die erste Spalte ist nicht eindeutig benannt haben, würde ich vorschlagen, um zu versuchen, explizit die Primärschlüsselspalte zu setzen (s) der Datentabelle, bevor die DataReader- geladen werden.

Für den Fall, jemand ein ähnliches Problem wie canceriens hat, war ich mit Wenn DataReader.Read ... statt Wenn DataReader.HasRows Existenz zu überprüfen, bevor dt.load(DataReader) Doh ruft!

das gleiche Problem hat. Es liegt daran, dass der Primärschlüssel auf allen Zeilen gleich ist. Es ist wahrscheinlich, was die Ergebnisse Schlüssel verwendet wird ist, und deshalb ist es nur die gleiche Zeile immer und immer wieder überschrieben werden.

Datatables.Load verweist auf die Fill-Methode zu verstehen, wie es funktioniert. Diese Seite heißt es, dass es Primärschlüssel bewusst ist. Da Primärschlüssel kann nur einmal vorkommen und als Schlüssel für die Zeile verwendet ...

"Die Fill-Operation fügt dann die Zeilen Ziel Datatable-Objekte im DataSet, die Datatable-Objekte zu schaffen, wenn sie nicht bereits vorhanden ist. Wenn Datatable-Objekte erstellen, der Füllvorgang erzeugt normalerweise nur Spaltennamen Metadaten. Wenn jedoch den Missing Eigenschaft auf AddWithKey, entsprechende Primärschlüssel und Einschränkungen werden auch geschaffen.“ (Http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx)

Kam heute über dieses Problem.

Nichts in diesem Thread fixierte es leider, aber dann wickelte ich meine SQL-Abfrage in einer anderen SELECT-Anweisung und es funktioniert!

Beispiel:

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

Seltsam ....

Verwenden Sie keine

dr.Read()

Weil es den Zeiger auf die nächste Zeile bewegt. Entfernen Sie hoffen, dass diese Linie wird es funktionieren.

Können Sie die aktuelle Abfrage greifen, die von SQL Profiler ausgeführt wird, und versuchen, es läuft? Es kann nicht sein, was Sie erwartet.

Haben Sie das gleiche Ergebnis, wenn ein SqlDataAdapter.Fill (Datatable) mit?

Haben Sie verschiedene Befehle Verhaltensweisen auf dem Leser versucht? MSDN Docs

Ich weiß, dass dies eine alte Frage, aber für mich die Meinung ist, dass während der Abfrage eine Access-Datenbank gearbeitet und es zu merken fehlte 1 R. Abfrage, war folgendes zu ändern: -

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

    if(dataset.hasrows) - Missing row appears.

Nicht sicher, warum Sie die Zeile in der Datentabelle fehlen, ist es möglich, dass Sie den Leser schließen müssen? In jedem Fall ist hier, wie ich normalerweise Berichte laden und es funktioniert jedes Mal ...

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

Neugierig zu sehen, ob es noch passiert.

In meinem Fall weder ORDER BY noch dt.AcceptChanges () arbeitet. Ich weiß nicht, warum das Problem ist. Ich habe 50 Datensätze in der Datenbank, aber es zeigt nur 49 in der Datentabelle. erste Zeile überspringen, und wenn es nur ein Datensatz in Datareader ist es zeigt nichts.

Was für ein bizzareeee .....

Haben Sie versucht dt.AcceptChanges() nach dem dt.Load(cmd.ExecuteReader()) Aufruf aufrufen, um zu sehen, ob das hilft?

Ich weiß, dass dies eine alte Frage ist, aber ich erlebte das gleiche problem und keine der Problemumgehungen, die hier erwähnt hast, Hilfe.

In meinem Fall, mit einem alias für die Spalte verwendet wird, wie die PrimaryKey das Thema gelöst.

So, statt

SELECT a
     , b
FROM table

Ich verwendet

SELECT a as gurgleurp
     , b
FROM table

und es funktionierte.

Ich habe das gleiche Problem .. tut überhaupt nicht verwendet dataReader.Read () .. wird es nimmt den Zeiger auf die nächste Zeile. Statt direkt datatable.load verwenden (Datareader).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top