Wir haben eine Menge von Datenschicht Code, der diese sehr allgemeine Muster folgt:Return Datareader von Datalayer in Using-Anweisung
public DataTable GetSomeData(string filter)
{
string sql = "SELECT * FROM [SomeTable] WHERE SomeColumn= @Filter";
DataTable result = new DataTable();
using (SqlConnection cn = new SqlConnection(GetConnectionString()))
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
result.Load(cmd.ExecuteReader());
}
return result;
}
Ich denke, wir können ein wenig besser machen. Meine Hauptbeschwerde ist, dass alle Datensätze in den Speicher geladen werden müssen, auch für große Sets. Ich möchte in der Lage sein, die Fähigkeit eines DataReaders zu nutzen, nur einen Datensatz in Ram zu einem Zeitpunkt zu behalten, aber wenn ich den DataReader direkt zurückschicke, wird die Verbindung abgeschnitten, wenn der using-Block verlassen wird.
Wie kann ich dies verbessern, um die Rückgabe einer Zeile zu einer Zeit zu ermöglichen?
Aber nicht alle Datensätze in den Speicher im Allgemeinen besser als Laden mit einem Datareader eine Verbindung offen für die Datenbank zu halten? – codeulike
Es kommt darauf an. Für eine winforms App, ja. Für eine Web-App, bei der Speicher knapp ist und Abfragen ohnehin schnell beendet werden müssen, wahrscheinlich nicht. –
Können Sie genauer angeben, welchen "echten Vorteil von DataReader" Sie haben möchten? –