So geben Sie einen MySqlDataReader zurück, bevor der Reader geschlossen wird [Duplikat]
-
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!
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"));
}