我在网上找到了这个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"发布于 2021-01-05 15:02:24
您没有为sql.Execute提供足够的参数。
仔细观察:
exec采用三个参数-- bind、parametres (顺便说一句),以及querybindExecute的结果是一个仍然期望其他两个参数的函数--当您调用sql.Execute时,只给它一个参数- [query],它最终将绑定到parametres因此,调用sql.Execute [query]的结果是另一个函数,它仍然期望在执行其主体之前提供最终参数。实际上,如果您密切关注编译器警告,您将看到编译器实际上告诉您的是:
这个表达式是一个函数值,即缺少参数。它的类型是。
若要修复,请提供正确的参数。从我看到的查询中的一小部分判断,我假设它不应该有任何parametres,所以我将在那里放置一个空列表:
sql.Execute [] queryhttps://stackoverflow.com/questions/65580012
复制相似问题