f# - 使常量成为从 F# 中的函数生成的字符串
问题描述
我是 F# 的新手,我一直在从这个问题中解脱出来:
SqlCommandProvider 需要一个我无法通过以下函数提供的常量字符串。在 F# 交互中运行它会返回“这不是有效的常量表达式或自定义属性值。”
let textgen (RIC: string, price: float, volume: int, inst: int, time:string) =
let mutable mystring = "INSERT INTO hsbc(RIC, price, volume, type, time) VALUES (st1, st2, st3, st4, st5)"
mystring <- mystring.Replace ("st1", RIC)
mystring <- mystring.Replace ("st2", price.ToString())
mystring <- mystring.Replace ("st3", volume.ToString())
mystring <- mystring.Replace ("st4", inst.ToString())
mystring <- mystring.Replace ("st5", time)
mystring
let sqlcommand1 = textgen("0005.hk",71.2,5000,1,"2019-07-18 10:34:09.193")
type writedata4=SqlCommandProvider<sqlcommand1,connStr>
do
let cmd6 = new writedata4(connStr)
cmd6.Execute()
0
我做了一些研究,知道这是 sqlcommand1 在编译期间不是常量的问题。所以我尝试了这个:
[<Literal>]
let sqlcommand1 = textgen("0005.hk",71.2,5000,1,"2019-07-18 10:34:09.193")
再次返回:“这不是有效的常量表达式或自定义属性值”
任何帮助将不胜感激,非常感谢!
更新:谢谢!我改编了@Mark Pattison 的代码,这很有效:
let mywrite(RIC: string, price: float, volume: int, inst: int, time:string) =
use cmd99 = new SqlCommandProvider<"INSERT INTO hsbc(RIC, price, volume, type, time) VALUES (@st1, @st2, @st3, @st4, @st5)", connStr>(connStr)
cmd99.Execute(st1=RIC,st2=price,st3=volume,st4=inst,st5=System.DateTime.Parse time)
|> ignore
但是,官方文档确实提到:
let cmd = new SqlCommandProvider<const(SqlFile<"GetDate.sql">.Text), connStr>(connStr)
cmd.Execute() |> ignore
由于该命令是从外部文本加载的,因此编译时间的确定性应该更小并且不应该工作(但它似乎工作)。你能告诉我为什么吗?谢谢
解决方案
这个想法是命令文本是一个编译时常量。显然你sqlcommand1
不能,因为它是在运行时通过调用创建的textgen
。
下面是如何使用@
, 来自docs创建参数化命令的示例:
open FSharp.Data
[<Literal>]
let connectionString =
@"Data Source=.;Initial Catalog=AdventureWorks2012;Integrated Security=True"
do
use cmd = new SqlCommandProvider<"
SELECT TOP(@topN) FirstName, LastName, SalesYTD
FROM Sales.vSalesPerson
WHERE CountryRegionName = @regionName AND SalesYTD > @salesMoreThan
ORDER BY SalesYTD
" , connectionString>(connectionString)
cmd.Execute(topN = 3L, regionName = "United States", salesMoreThan = 1000000M) |> printfn "%A"
//output
//seq
// [("Pamela", "Ansman-Wolfe", 1352577.1325M);
// ("David", "Campbell", 1573012.9383M);
// ("Tete", "Mensa-Annan", 1576562.1966M)]
您可以看到命令字符串本身(开始SELECT...
)是一个常量字符串。
推荐阅读
- arrays - Ruby Set 和 Ruby Array,它们是否使用 postgresql 以相同的方式存储?
- dax - 从 2 个事实表创建数据透视表
- mysql - MySql WHERE 与计数聚合列 - 不可能,那么解决方案是什么?
- .htaccess - How to allow access to files for all sites while maintaining htaccess redirection
- python - Python Sockets:客户端和服务器都相互发送和接收数据?
- pytorch - 图中似乎没有使用其中一个微分张量
- python - 'URLPattern' 对象不是映射。姜戈
- python - Pandas 时间序列分析
- python - 用于在 Scholarly 中匹配论文 ID 的 Python
- kentico - 用于管理 Kentico 自定义模块中的类之间的一对多关系的 UI