在Dapper中调用QueryAsync会引发InvalidOperationException

时间:2013-09-10 07:46:20

标签: asp.net-web-api async-await dapper

我正在试用dapper中的异步支持,当运行一个简单的用例时,我遇到了以下问题。我有一个ApiController,只是使用dapper触发日志条目在数据库中创建它。我的数据库连接很好。当我从dapper运行使用Query扩展方法的同步版本时,一切正常。当我使用QueryAsync和async / await结构时,我得到一个InvalidOperationException。这是代码的样子

public class BackgroundController : ApiController
{
    [HttpGet]
    public async Task<HttpResponseMessage> Run(string op)
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Backgrounder"].ConnectionString))
        {
            const string sql =
                "Insert Into SimpleLog (message, threadid, created) Values(@message, @threadid, @created); " +
                "SELECT CAST(SCOPE_IDENTITY() as int)";
            var results = await (connection.QueryAsync<int>(sql, new { message = "new log record", threadid = "1", created = DateTime.Now }));
            var id = results.SingleOrDefault();
            Debug.WriteLine("inserted log record id: " + id);
        }
        return this.Request.CreateResponse(HttpStatusCode.OK);
    }
}

此外,这是堆栈跟踪的样子:

在System.Data.SqlClient.SqlCommand.b_ 24(任务1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke()    在System.Threading.Tasks.Task.Execute()    ---从抛出异常的先前位置开始的堆栈跟踪结束---    在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Dapper.SqlMapper.<QueryAsync>d__69 1.MoveNext()在c:\ Dev \ Dapper \ Dapper NET45 \ SqlMapperAsync.cs:第21行    ---从抛出异常的先前位置开始的堆栈跟踪结束---    在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()    在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()    在WebApiBackgrounder.Controllers.BackgroundController.d _0.MoveNext()

当dapper调用ExecuteReaderAsync时似乎失败了。有人怎么解决这个问题?

修改

这里是连接字符串

 <add name="Backgrounder" providerName="System.Data.SqlClient" connectionString="Data Source=LPW7X6530;Initial Catalog=Sandbox;Integrated Security=SSPI;" />

1 个答案:

答案 0 :(得分:2)

根据错误消息,听起来好像连接未打开。碰巧的是,小巧玲珑通常会试图为你做这件事 - 所以你没有先调用Open()并不是没有道理的 - 我想我们错过了。现在:在连接上调用Open()。