Frage

Ich bin immer etwas ziemlich seltsam los, wenn sie versuchen, einige Daten mit dem MySql .net Anschluss zu lesen. Hier ist der Code:

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

Wenn ich einen Haltepunkt nach dem ExecuteReader setzen und erweitern die Ergebnisse in Visual Studio anzuzeigen (über Leser schweben und erweitert), kann ich die Zeilen von der Abfrage zurückgegeben sehen. Wenn ich dann so nah lassen und die Resultate zu sehen erweitern wieder, erhalte ich die Meldung ‚Enumeration keine Treffer‘.

Es scheint, als ob der Inhalt des Lesers wird zurückgesetzt bekommen, sobald sie gesehen sind.

Als für das, was wir versucht haben:
- die SQL läuft direkt auf DB
Fein - Binden Sie die Ergebnisse der Abfrage direkt an ein Datagrid gibt nur einen leeren Datenraster
- habe die aktuellste Version des .NET Connector
- versucht, auf zwei verschiedenen Maschinen alle lokalen Fehler auszuschließen

Bisher nichts hat funktioniert.

Wenn jemand irgendwelche Ideen oder Vorschläge anbieten könnten, würden sie sehr geschätzt werden.

War es hilfreich?

Lösung

von dem, was ich verstehe die SqlDataReader soll für eine einmalige Aufzählung der Daten verwendet werden Sie zurückgeschickt haben. Sobald Sie einmal durch die Ergebnisse durchlaufen haben, hat das Objekt seine Pflicht getan. Hier sind ein paar Ideen für um diese Arbeit, die eine oder andere, von denen diese lösen können Sie je nach Ihren Bedürfnissen:

  1. erneut ausführen die Abfrage eines anderen SqlDataReader zu erzeugen, wenn erforderlich

  2. Statt die SqlDataReader verwenden, speichern Sie die Ergebnisse Ihrer ursprünglichen Abfrage in eine System.Data.DataTable, wo man dann wieder lesen und manipulieren die Daten jedoch wie Sie.

Hope, das hilft!

Adam

Andere Tipps

Da ein Datareader in Informationen liest, schließt Ihr mit Block die Verbindung mit dem Leser unmittelbar nach dessen Wert auf der Variablen zugewiesen wird. Hier Artikel das zeigt Ihnen einige Beispiele von Code, der Sie bekommen könnte, wo Sie sein müssen.

Der Schlüssel ist, dass die Verbindung geöffnet sein müssen, wenn sie versuchen, von dem Leser zu lesen.

Hier ist die Erklärung:

Das ist, weil Sie bereits durch die Leser einmal im Debugger geschlungen haben (das erste Mal, wenn Sie die Ansicht erweitert). Dies ist die Art, wie die Leser arbeiten, und von dem, was ich weiß, gibt es keine Möglichkeit, einen Leser zum Zurücksetzen wieder von Anfang an zu gehen und zu lesen, mit Ausnahme die Wiederausführung Option:

  

Sie müssen nur laufen wieder   cmd.ExecuteReader(); Linie (von rechts   Klicken Sie in der Quelle und mit „gesetzt   nächste Anweisung“Menü-Option).

Dies ist das Verhalten der Datenleser. Wenn Sie bereits durchgeschleift haben, können Sie nicht mehr zurück. Sie haben den Befehl erneut auszuführen und eine neue abgerufen werden.

Wenn Sie Ihre Daten verwenden, nachdem der Leser zu schließen, können Sie wählen, eine Typed DataSet zu verwenden, oder die nicht typisierte DataSet wie in Adams Antwort .

By the way, hier einige optimizations sind Sie könnten machen:

  • Bewegen Sie den Leser innerhalb der Connection Block mit machen gehen out of scope nach Fertigstellung indem es (wenn man aus der Verwendung ist Block, wird die Verbindung geschlossen werden und Sie werden es ohnehin nicht in der Lage zu nutzen, so dass es keinen Sinn macht es draußen zu verlassen)
  • Ausführen ExecuteReader in ein anderer using Block (wie es implementiert IDisposable) und das gleiche tun mit dem Sql Command (die gleiche IDisposable Schnittstelle)
  • Sie nicht abrufen alle Felder aus der Datenbank
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top