gpt4 book ai didi

f# - 具有 fsharp 数据 SqlClient 的命名参数

转载 作者:行者123 更新时间:2023-12-05 04:16:25 26 4
gpt4 key购买 nike

从外部文件加载 T-Sql 时,我无法编译此代码。当 T-Sql 直接插入到 F# 中时,代码有效:

 type GetRecentMedia =
SqlCommandProvider<"DECLARE @MedId NVARCHAR(128);
DECLARE @TopN INT;

select Top(@TopN) * from media.mediaInfo
where MediaId = @MedId",
Admin.connectionString, ConfigFile = "Web.config">

但是当我尝试从 sql 文件加载 T-Sql 时出现此错误:

Execute takes 0 arguments but here is given 2.

T-SQL:

DECLARE @MedId NVARCHAR(128);
DECLARE @TopN INT;

select Top(@TopN) * from media.mediaInfo
where MediaId = @MedId

F#:

module internal FeedRecentMedia =

type GetRecentMedia =
SqlCommandProvider<"Social\InstagramFeed_Select_GetRecentMedia.sql",
Admin.connectionString, ConfigFile = "Web.config">
module MediaTool =

// get current media
let rM = new FeedRecentMedia.GetRecentMedia()
let curMedia = rM.Execute(MedId = "Id", TopN = 1) |> Seq.head

我在 Management Studio 中测试了 t-sql,它在那里工作。我只收到上述错误。我在这里缺少什么?

最佳答案

这是一个 documented SqlClient 类型提供程序的限制。您从 F# 代码传递给 T-SQL 的参数必须是

  • 未声明(如果类型不明确,例如数字类型,这可能是个问题)
  • 只用过一次

幸运的是,文档中提供的相同解决方法解决了这两个问题:您使用外部变量作为参数声明了一个变量。这还可以让您显式注释类型:

type FizzOrBuzz = SqlCommandProvider<"
DECLARE @x AS INT = @xVal
SELECT
CASE
WHEN @x % 3 = 0 AND @x % 5 = 0 THEN 'FizzBuzz'
WHEN @x % 3 = 0 THEN 'Fizz'
WHEN @x % 5 = 0 THEN 'Buzz'
ELSE CONCAT(@x, '') --use concat to avoid nullable column
END", connectionString>

let fizzOrBuzz = new FizzOrBuzz()
printfn "Answer on interview:\n%A" [ for i = 1 to 100 do yield! fizzOrBuzz.Execute(i) ]

关于f# - 具有 fsharp 数据 SqlClient 的命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27853567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com