Commit c8aa54b2 authored by Marc Gravell's avatar Marc Gravell

Fix issue 178: ExecuteReader now returns a wrapper around the command/reader...

Fix issue 178: ExecuteReader now returns a wrapper around the command/reader pair, so that the lifetime of the command is extended

Also improve documentation around use of "dynamic" in Query()
parent 79672cd2
This diff is collapsed.
...@@ -17,6 +17,7 @@ public static partial class SqlMapper ...@@ -17,6 +17,7 @@ public static partial class SqlMapper
/// <summary> /// <summary>
/// Execute a query asynchronously using .NET 4.5 Task. /// Execute a query asynchronously using .NET 4.5 Task.
/// </summary> /// </summary>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public static Task<IEnumerable<dynamic>> QueryAsync(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) public static Task<IEnumerable<dynamic>> QueryAsync(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
{ {
return QueryAsync<dynamic>(cnn, typeof(DapperRow), new CommandDefinition(sql, (object)param, transaction, commandTimeout, commandType, CommandFlags.Buffered, default(CancellationToken))); return QueryAsync<dynamic>(cnn, typeof(DapperRow), new CommandDefinition(sql, (object)param, transaction, commandTimeout, commandType, CommandFlags.Buffered, default(CancellationToken)));
...@@ -25,6 +26,7 @@ public static Task<IEnumerable<dynamic>> QueryAsync(this IDbConnection cnn, stri ...@@ -25,6 +26,7 @@ public static Task<IEnumerable<dynamic>> QueryAsync(this IDbConnection cnn, stri
/// <summary> /// <summary>
/// Execute a query asynchronously using .NET 4.5 Task. /// Execute a query asynchronously using .NET 4.5 Task.
/// </summary> /// </summary>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public static Task<IEnumerable<dynamic>> QueryAsync(this IDbConnection cnn, CommandDefinition command) public static Task<IEnumerable<dynamic>> QueryAsync(this IDbConnection cnn, CommandDefinition command)
{ {
return QueryAsync<dynamic>(cnn, typeof(DapperRow), command); return QueryAsync<dynamic>(cnn, typeof(DapperRow), command);
...@@ -545,6 +547,7 @@ internal GridReader(IDbCommand command, IDataReader reader, Identity identity, D ...@@ -545,6 +547,7 @@ internal GridReader(IDbCommand command, IDataReader reader, Identity identity, D
/// <summary> /// <summary>
/// Read the next grid of results, returned as a dynamic object /// Read the next grid of results, returned as a dynamic object
/// </summary> /// </summary>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public Task<IEnumerable<dynamic>> ReadAsync(bool buffered = true) public Task<IEnumerable<dynamic>> ReadAsync(bool buffered = true)
{ {
return ReadAsyncImpl<dynamic>(typeof(DapperRow), buffered); return ReadAsyncImpl<dynamic>(typeof(DapperRow), buffered);
......
...@@ -3895,13 +3895,14 @@ public void Issue178_SqlServer() ...@@ -3895,13 +3895,14 @@ public void Issue178_SqlServer()
connection.Open(); connection.Open();
const string sql = @"select count(*) from Issue178"; const string sql = @"select count(*) from Issue178";
try { connection.Execute("drop table Issue178"); } catch { } try { connection.Execute("drop table Issue178"); } catch { }
try { connection.Execute("create table Issue178(id int not null)"); } catch { } connection.Execute("create table Issue178(id int not null)");
connection.Execute("insert into Issue178(id) values(42)");
// raw ADO.net // raw ADO.net
var sqlCmd = new FbCommand(sql, connection); using (var sqlCmd = new FbCommand(sql, connection))
using (IDataReader reader1 = sqlCmd.ExecuteReader()) using (IDataReader reader1 = sqlCmd.ExecuteReader())
{ {
Assert.IsTrue(reader1.Read()); Assert.IsTrue(reader1.Read());
reader1.GetInt32(0).IsEqualTo(0); reader1.GetInt32(0).IsEqualTo(1);
Assert.IsFalse(reader1.Read()); Assert.IsFalse(reader1.Read());
Assert.IsFalse(reader1.NextResult()); Assert.IsFalse(reader1.NextResult());
} }
...@@ -3910,10 +3911,13 @@ public void Issue178_SqlServer() ...@@ -3910,10 +3911,13 @@ public void Issue178_SqlServer()
using (var reader2 = connection.ExecuteReader(sql)) using (var reader2 = connection.ExecuteReader(sql))
{ {
Assert.IsTrue(reader2.Read()); Assert.IsTrue(reader2.Read());
reader2.GetInt32(0).IsEqualTo(0); reader2.GetInt32(0).IsEqualTo(1);
Assert.IsFalse(reader2.Read()); Assert.IsFalse(reader2.Read());
Assert.IsFalse(reader2.NextResult()); Assert.IsFalse(reader2.NextResult());
} }
var count = connection.Query<int>(sql).Single();
count.IsEqualTo(1);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment