让 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
        }