【问题标题】:MultiExec is not supported by ExecuteReaderExecuteReader 不支持 MultiExec
【发布时间】:2021-06-19 21:39:46
【问题描述】:

我有以下代码:

let getByIdAsync (connectionString : string) (id : int) = 
        let sql = @"SELECT * FROM [User] WHERE [Id] = @id"
        let args = [ "id" => id ]

        async {
            use connection = new SqlConnection(connectionString)
            do! connection.OpenAsync() |> Async.AwaitTask

            try
                use! reader = connection.ExecuteReaderAsync(sql, args) |> Async.AwaitTask
                return reader |> mapRowsToRecords |> Seq.head
            with
            | e -> return Error e.Message
        }

这段代码抛出MultiExec is not supported by ExecuteReader,我不知道为什么。其他查询(例如我的插入)工作得很好。我做错了什么?

【问题讨论】:

  • 可能dup.
  • 不,我已经看过那个了,不明白,我不明白我是如何获得多个 exec 的。我只有一个查询。
  • 我不确定这是不是问题,但您调用OpenAsync 然后忽略结果,这意味着ExecuteReaderAsync 原则上可以在连接(完全)打开之前启动.你应该使用do!OpenAsync
  • @TomasPetricek 谢谢你,很好的收获!我正在学习 F# 并且正在寻找一种方法来做 await OpenAsync() 所以我正在尝试各种黑客。不幸的是,这并不能解决问题,但会更新问题中的代码。

标签: .net sql-server f# ado.net dapper


【解决方案1】:

我知道出了什么问题,字典前少了dict

let getByIdAsync (connectionString : string) (id : int) = 
        let sql = @"SELECT * FROM [User] WHERE [Id] = @id"
        let args = dict [ "id" => id ] // added dict

        async {
            use connection = new SqlConnection(connectionString)
            do! connection.OpenAsync() |> Async.AwaitTask

            try
                use! reader = connection.ExecuteReaderAsync(sql, args) |> Async.AwaitTask
                return reader |> mapRowsToRecords |> Seq.head
            with
            | e -> return Error e.Message
        }

查看this article了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多