So geben Sie einen MySqlDataReader zurück, bevor der Reader geschlossen wird [Duplikat]

StackOverflow https://stackoverflow.com//questions/11658084

  •  11-12-2019
  •  | 
  •  

Frage

Okay, mein Code ist derzeit:

    public MySqlDataReader CreateQuery(string queryString, string connectionString )
    {

        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();
                return reader;
            }
        }
    }

In einer anderen Funktion habe ich:

using(MySqlDataReader readers = _connection.CreateQuery(query, connectString))

Derzeit gibt es in dieser Form keinen Wert, wenn ich den Leser in einen Leser zurückgebe.Ich bin durchgegangen und habe überprüft, ob der Leser zum Zeitpunkt der Rücksendung die richtigen Informationen darin hatte.Dennoch hat der Leser keine Werte.Ich übersehe wahrscheinlich etwas völlig Dummes.Aber jede Hilfe dabei ist willkommen.Danke!

War es hilfreich?

Lösung

Mit dem Befehl „using“ wird Ihr Code tatsächlich die Verbindung und den Befehl verwerfen, bevor die Kontrolle an den Aufrufer zurückgegeben wird.Im Wesentlichen werden Ihr Verbindungsobjekt und Ihr in den using-Anweisungen erstelltes Befehlsobjekt verworfen, bevor der aufrufende Code es verwenden kann, sodass es nicht mehr verwendet werden kann.

Sie möchten wahrscheinlich eher mit den Ergebnissen der Abfrage als mit dem Reader selbst etwas anfangen.Vielleicht in eine Tabelle laden?Etwas wie:

public DataTable CreateQuery(string queryString, string connectionString )
    {
        DataTable results =  new DataTable("Results");
        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                using (MySqlDataReader reader = command.ExecuteReader())
                    results.Load(reader);
            }
        }
       return results;
    }

Andere Tipps

Anstatt das zurückzugeben Datareader oder alle Datensätze in einen In-Memory kopieren DataTable dass du als Ganzes zurückkehrst, könntest du zurückgeben IEnumerable<IDataRecord> Das ist die grundlegende Schnittstelle a DataReader Plattengeräte aufzeichnen.

Das sollte also seit dem funktionieren yield verursacht die Connection am Leben erhalten:

public IEnumerable<IDataRecord> CreateQuery(string queryString, string connectionString)
{
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        using (MySqlCommand command = new MySqlCommand(queryString, connection))
        {
            command.Connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return (IDataRecord)reader;
                }
            }
         }
    }
}

Wenn Sie beispielsweise nur die ersten 5 Datensätze übernehmen möchten:

var records = CreateQuery("SELECT * FROM ais.country;", Properties.Settings.Default.MySQL).Take(5);
foreach (IDataRecord rec in records)
{
    String country = rec.GetString(rec.GetOrdinal("Name"));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top