SqlDataReader ?
. , .
DataReader Connection ExecuteReader ExecuteReaderAsync CommandBehavior.CloseConnection. , Reader ( ).
CommandBehavior.CloseConnection , "--", , -. 2.
1. ,
, Connection, Create Command, Execute Reader :
public async Task<Foo> GetOneFoo(int idToFetch)
{
using (var myConn = new SqlConnection(_connectionString))
using (var cmd = new SqlCommand("SELECT Id, Col2, ... FROM Foo WHERE Id = @Id"))
{
await myConn.OpenAsync();
cmd.Parameters.AddWithValue("@Id", idToFetch);
using (var reader = await cmd.ExecuteReaderAsync())
{
var myFoo = new Foo
{
Id = Convert.ToInt32(reader["Id"]),
... etc
}
return myFoo;
}
}
}
2. , Long Lived Reader
CommandBehavior.CloseConnection, , Reader .
, DataReaders, , yield return - , , (, , ) , .
public async Task<IEnumerable<Foo>> LazyQueryAllFoos()
{
var sqlConn = new SqlConnection(_connectionString);
using (var cmd = new SqlCommand(
$"SELECT Col1, Col2, ... FROM LargeFoos", mySqlConn))
{
await mySqlConn.OpenAsync();
var reader = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection);
return GenerateFoos(reader);
}
}
private static IEnumerable<Foo> GenerateFoos(IDataReader reader)
{
using(reader)
{
while (reader.Read())
{
yield return new Foo
{
Id = Convert.ToInt32(reader["Id"]),
...
};
}
}
}
- # 6,
async , , ( , , ). GenerateFoos , ( ) , , , .
source
share