来自 SQLHelper 的 ExecuteNonQuery

ExecuteNonQuery from SQLHelper

我在网上找到了这个 SQLHelper,我想用它 运行 SQL 查询。 但是助手想要一个列表而不是一个字符串。 而且我似乎无法弄清楚如何使 executeNonQuery 工作。

   type SqlHelper (connection) =
        let exec bind parametres query = 
            use conn = new SqlConnection (connection)
            conn.Open()
            use cmd = new SqlCommand (query, conn)
            parametres |> List.iteri (fun i p -> 
                            cmd.Parameters.AddWithValue(sprintf "@p%d"  i, box p) |> ignore)
            bind cmd
    
        member __.Execute = exec <| fun c -> c.ExecuteNonQuery() |> ignore
        member __.Scalar  = exec <| fun c -> c.ExecuteScalar()
        member __.Read f  = exec <| fun c -> [ let read = c.ExecuteReader()
                                               while read.Read() do 
                                                   yield f read ]
let sql = new SqlHelper (connectionString)

我的查询是为了添加表格

我正在尝试这样执行。

let emptyDb =
    let query =
    "SET NOCOUNT ON
      DROP TABLE IF EXISTS #STUFF
      ...
      ...    
      END"
sql.Execute [query ]

这可以编译,但是当我执行它时没有任何反应。 有任何想法吗? 提前致谢

编辑:sql.Read 功能完美

let GetToken Id= 
    sql.Read (fun r -> { token = unbox r.[0] })
             [Id;] 
             "SELECT Token
             FROM [dbo].[Token]
             WHERE id= 0"

GetToken "1337"

您没有为 sql.Execute 提供足够的参数。

仔细观察:

  • exec 采用三个参数 - bindparametres(顺便说一句,打字错误)和 query
  • Execute 的正文中,你给它一个参数 - bind
  • 因此,Execute 的结果是一个仍然需要其他两个参数的函数 - parametresquery
  • 但是当你调用 sql.Execute 时,你只给它一个参数 - [query],它最终会绑定到 parametres

因此,调用sql.Execute [query]的结果是另一个函数,它仍然希望在执行主体之前提供最终参数。事实上,如果你密切关注编译器警告,你会发现编译器实际上告诉你的是:

This expression is a function value, i.e. is missing arguments. Its type is ...

要修复,请提供正确的参数。根据我可以看到的一小部分查询来判断,我认为它不应该有任何 parametres,所以我会在那里放一个空列表:

sql.Execute [] query