【问题标题】:Named Parameters with fsharp data SqlClient带有 fsharp 数据 SqlClient 的命名参数
【发布时间】:2015-03-07 08:40:00
【问题描述】:

从外部文件加载 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 需要 0 个参数,但这里给出 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,它在那里工作。我只收到上述错误。我在这里错过了什么?

【问题讨论】:

  • 我进行了更新。我发现直接在F#中插入t-sql时效果很好,但在外部加载时仍然无法正常工作。
  • 你认为为什么需要在 T-SQL 中声明变量?
  • 主要用于在管理工作室中测试查询。我离开声明只是因为我认为它不会影响任何事情。我应该完全删除它吗?
  • 是的,我认为它吓坏了 SQL 分析器

标签: f# f#-data fsharp.data.sqlclient


【解决方案1】:

这是 SqlClient 类型提供程序的documented 限制。从 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) ]

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2019-06-18
    • 2018-08-11
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多