F# 如何将参数传递给FsSql中的Sql.execReaderF?
我正在试用FsSql的示例,似乎还停留在如何正确使用Sql.execReaderF函数的问题上。示例代码使用int参数,但我有一个字符串。下面的代码块显示了我的尝试。FsSql是否仅支持此函数的int 设置代码: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() =
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"