F# 如何将参数传递给FsSql中的Sql.execReaderF?

F# 如何将参数传递给FsSql中的Sql.execReaderF?,f#,f#-data,F#,F# Data,我正在试用FsSql的示例,似乎还停留在如何正确使用Sql.execReaderF函数的问题上。示例代码使用int参数,但我有一个字符串。下面的代码块显示了我的尝试。FsSql是否仅支持此函数的int 设置代码: module FsSqlTests open System open System.Data open System.Data.SqlClient open NUnit.Framework open Swensen.Unquote let openConn() =

我正在试用FsSql的示例,似乎还停留在如何正确使用Sql.execReaderF函数的问题上。示例代码使用int参数,但我有一个字符串。下面的代码块显示了我的尝试。FsSql是否仅支持此函数的int

设置代码:

module FsSqlTests

open System
open System.Data
open System.Data.SqlClient
open NUnit.Framework
open Swensen.Unquote

let openConn() =
        let conn = new SqlConnection(@"Data Source=MYSERVER;Initial Catalog=MYDB;Integrated Security=True")
        conn.Open()
        conn :> IDbConnection

let connMgr = Sql.withNewConnection openConn 

let P = Sql.Parameter.make

let execReader sql = Sql.execReader connMgr sql 

let execReaderf sql = Sql.execReaderF connMgr sql
使用Sql.execReader(使用此命令通过测试用例)

使用Sql.execReaderF(使用此测试用例失败)

在测试用例中调用代码:

[<TestCase>]
let ``Gets CM summary given eFolderName``() =
    let c = selectSummaryByeFolderName "CM008671"

    let r = c
            |> Seq.ofDataReader
            |> Seq.map(fun dr ->
                let s = 
                    match dr?summary with
                    | None -> "No Summary"
                    | Some x -> x
                s)
            |> Seq.length

    test <@ r > 0 @>

我看了一下实现,试图验证这一点,但这超出了我的理解范围。无论如何,Sql.execReader函数对于其他数据类型也可以很好地工作,因此我可以切换到该函数作为字符串参数。

我不熟悉FsSql,但在使用
execReaderF
的示例中,始终有
conn
作为第一个参数,Sql命令作为第二个参数。也许你需要绕过连接对象?也许是这样。在我看来,连接是由部分应用程序提供的,设置代码中的最后一行是:let execReaderf sql=sql.execReaderf connMgr sqlHmm,是的,应该是这样!在这种情况下,我不确定这里发生了什么…它肯定应该在
%s
周围没有引号的情况下调用。%是参数的占位符,而不是实际值的占位符。您可以在这里的
stripFormatting
中看到,它用
@pN
替换了任何
%.
,因此您得到的sql结果是
'@p0'
。我不知道这是否是唯一的问题。我不熟悉FsSql,但在使用
execReaderF
的示例中,始终有
conn
作为第一个参数,SQL命令作为第二个参数。也许你需要绕过连接对象?也许是这样。在我看来,连接是由部分应用程序提供的,设置代码中的最后一行是:let execReaderf sql=sql.execReaderf connMgr sqlHmm,是的,应该是这样!在这种情况下,我不确定这里发生了什么…它肯定应该在
%s
周围没有引号的情况下调用。%是参数的占位符,而不是实际值的占位符。您可以在这里的
stripFormatting
中看到,它用
@pN
替换了任何
%.
,因此您得到的sql结果是
'@p0'
。我不知道这是否是唯一的问题。
let selectSummaryByeFolderName = 
    execReaderf "select summary from ework.V_DQ_Iccm_Activity_By_Team WHERE efoldername = '%s'"
[<TestCase>]
let ``Gets CM summary given eFolderName``() =
    let c = selectSummaryByeFolderName "CM008671"

    let r = c
            |> Seq.ofDataReader
            |> Seq.map(fun dr ->
                let s = 
                    match dr?summary with
                    | None -> "No Summary"
                    | Some x -> x
                s)
            |> Seq.length

    test <@ r > 0 @>
let selectSummaryByCallPriority = 
    execReaderf "select top 10 summary from ework.V_DQ_Iccm_Activity_By_Team WHERE callpriority = %d"