让 Dapper 中的 QueryMultipleAsync 与 F# 一起工作
Getting QueryMultipleAsync in Dapper to work with F#
我们正尝试在 F# 中使用 dapper return 多个结果集。但是我不断收到无效操作异常。这是我们设置的:
let query<'T, 'T1> connStr sql =
async {
use connection = new SqlConnection(connStr)
do! connection.OpenAsync() |> Async.AwaitTask
use transaction = connection.BeginTransaction()
try
use! result =
connection.QueryMultipleAsync(sql.Query, dict sql.Parameters, transaction)
|> Async.AwaitTask
transaction.Commit()
let r1 = result.Read<'T>()
let r2 = result.Read<'T1>()
return (r1, r2)|> Ok
with
| ex ->
transaction.Rollback()
return ex |> DataException |> Error
}
预期结果将是一个序列元组,但目前我只是不断得到
System.InvalidOperationException: 'There is already an open DataReader associated with this Command which must be closed first.'
此问题似乎与读取前调用 transaction.commit 有关。这是此方法的正确实现:
let query<'T, 'T1> connStr sql =
async {
use connection = new SqlConnection(connStr)
do! connection.OpenAsync() |> Async.AwaitTask
use transaction = connection.BeginTransaction()
try
use! result =
connection.QueryMultipleAsync(sql.Query, dict sql.Parameters, transaction)
|> Async.AwaitTask
let r1 = result.Read<'T>()
let r2 = result.Read<'T1>()
// Move the commit after the reads
// Was before orignally
transaction.Commit()
return (r1, r2)|> Ok
with
| ex ->
transaction.Rollback()
return ex |> DataException |> Error
}
我们正尝试在 F# 中使用 dapper return 多个结果集。但是我不断收到无效操作异常。这是我们设置的:
let query<'T, 'T1> connStr sql =
async {
use connection = new SqlConnection(connStr)
do! connection.OpenAsync() |> Async.AwaitTask
use transaction = connection.BeginTransaction()
try
use! result =
connection.QueryMultipleAsync(sql.Query, dict sql.Parameters, transaction)
|> Async.AwaitTask
transaction.Commit()
let r1 = result.Read<'T>()
let r2 = result.Read<'T1>()
return (r1, r2)|> Ok
with
| ex ->
transaction.Rollback()
return ex |> DataException |> Error
}
预期结果将是一个序列元组,但目前我只是不断得到
System.InvalidOperationException: 'There is already an open DataReader associated with this Command which must be closed first.'
此问题似乎与读取前调用 transaction.commit 有关。这是此方法的正确实现:
let query<'T, 'T1> connStr sql =
async {
use connection = new SqlConnection(connStr)
do! connection.OpenAsync() |> Async.AwaitTask
use transaction = connection.BeginTransaction()
try
use! result =
connection.QueryMultipleAsync(sql.Query, dict sql.Parameters, transaction)
|> Async.AwaitTask
let r1 = result.Read<'T>()
let r2 = result.Read<'T1>()
// Move the commit after the reads
// Was before orignally
transaction.Commit()
return (r1, r2)|> Ok
with
| ex ->
transaction.Rollback()
return ex |> DataException |> Error
}