Abbiamo un sacco di codice strato di dati che segue questo schema molto generale:DataReader Ritorno da DataLayer in Uso dichiarazione
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;
}
penso che possiamo fare un po 'meglio. La mia lamentela principale in questo momento è che obbliga tutti i record a essere caricati in memoria, anche per i set di grandi dimensioni. Mi piacerebbe essere in grado di sfruttare l'abilità di un DataReader di tenere un solo record in ram alla volta, ma se restituisco direttamente il DataReader, la connessione viene interrotta quando si esce dal blocco using.
Come posso migliorare questo per consentire il ritorno di una riga alla volta?
Ma non sta caricando tutti i record in memoria in generale meglio di mantenere una connessione aperta al database con un DataReader? – codeulike
Dipende. Per un'app winforms, sì. Per un'app Web in cui la memoria è scarsa e le query devono essere completate rapidamente, probabilmente no. –
Puoi specificare più da vicino quale tipo di "vantaggio reale di DataReader" vorresti avere? –