来自 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
采用三个参数 - bind
、parametres
(顺便说一句,打字错误)和 query
- 在
Execute
的正文中,你给它一个参数 - bind
- 因此,
Execute
的结果是一个仍然需要其他两个参数的函数 - parametres
和 query
- 但是当你调用
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
我在网上找到了这个 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
采用三个参数 -bind
、parametres
(顺便说一句,打字错误)和query
- 在
Execute
的正文中,你给它一个参数 -bind
- 因此,
Execute
的结果是一个仍然需要其他两个参数的函数 -parametres
和query
- 但是当你调用
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