我有以下示例代码.目标是使用多个输入参数运行SQL语句.
[<Literal>]
let connectionString = @"Data Source=Localhost;Initial Catalog=Instrument;Integrated Security=True"
[<Literal>]
let query = "SELECT MacroName, MacroCode FROM Instrument WHERE MacroCode IN (@codeName)"
type MacroQuery = SqlCommandProvider<query, connectionString>
let cmd = new MacroQuery()
let res = cmd.AsyncExecute(codeName= [|"CPI";"GDP"|]) |> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
但是,codeName被推断为字符串类型而不是数组或列表,并给我一个错误.
或者,我可以在没有where语句的情况下运行查询,并根据结果进行过滤.但是,在很多其他返回数百万行的情况下,我更希望SQL服务器级别的过滤数据更有效.
我没有在fsharp.data.sqlclient的文档中找到任何相关的示例.请帮忙!
我正在使用FSharp.Data.SqlClient并尝试将我的connectionString从a移动[<Literal>]到app.config.
我的app.config看起来像这样
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Test;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我的SqlCommandProvider外观如下所示,根据http://fsprojects.github.io/FSharp.Data.SqlClient/configuration%20and%20input.html,这应该是正确的
new SqlCommandProvider<"SELECT ...",
ConnectionStringOrName = "name=DefaultConnection",
SingleRow = true,
AllParametersOptional = true>(??????)
Run Code Online (Sandbox Code Playgroud)
现在的问题是.最后一部分是什么,??????部分.
我试过"name=DefaultConnection"但它给了我一个运行时错误,名称不受支持.
我似乎找不到任何文件来解释那里发生了什么.
Instaed of fixnig我发现了这个问题的解决方法. https://fsprojects.github.io/FSharp.Configuration/
ConnectionStringOrName如果必须提供连接字符串,我无法达到目的.另外你为什么要指定它两次.对我来说没什么意义:(
好吧,奇怪的问题在这里。我正在使用FSharp.Data.SqlClient从我们的数据库中获取记录。它推断出的记录有几个字段,它们是选项类型。我需要过滤掉任何选项类型都为 None 的记录,并在已知字段的地方创建新记录。下面是我正在谈论的一个例子。为了解决这个问题,我创建了一个过滤器函数,recordFilter在所有类型都Option<'T>包含值的情况下返回我想要的类型,None当它们不包含时返回我想要的类型。
我的问题是是否有可能创建一个函数来自动检查Option<'T>记录中的所有字段是否有值。我猜这需要某种反射来遍历记录的字段。我猜这是不可能的,但我想把它扔掉,以防万一我错了。
如果这种方法是惯用的方式,那么我会很高兴听到这个。我只是想确保我不会错过一些更优雅的解决方案。F# 的可能性始终让我感到惊讶。
我的动机是我正在处理几十个字段的记录,这些字段的类型为Option<'T>. match...with像我在这个例子中所做的那样,不得不写出大量的语句是很烦人的。只有几个字段的时候还好,30+个字段的时候就烦了。
type OptionRecord = {
Id: int
Attr1: int option
Attr2: int option
Attr3: int option
Attr4: int option
Attr5: int option
Attr6: int option
}
type FilteredRecord = {
Id: int
Attr1: int
Attr2: int
Attr3: int
Attr4: int
Attr5: int
Attr6: int
}
let optionRecords = [for i in 1..5 ->
{
OptionRecord.Id = i
Attr1 = Some …Run Code Online (Sandbox Code Playgroud) 在操作通过FSharp.Data.SqlClient检索的数据时,在Sequence模块上使用查询表达式有什么优势吗?
例如:
query{
for row in SelectAllCategories.Execute() do
where row.Id = 1
select {
Id = row.Id;
Category = row.CategoryName
}
}
Run Code Online (Sandbox Code Playgroud)
与
SelectAllCategories.Execute()
|> Seq.filter (fun x -> x.Id = 1)
|> Seq.map (fun x ->
{
Id = x.Id;
Category = x.CategoryName
}
Run Code Online (Sandbox Code Playgroud)
就此而言,您甚至可以考虑使用LINQ.那么有什么好处,特别是关于FSharp.Data.SqlClient?
如何将obj列表转换为int类型.我试图使用下面的地图函数添加两个列表,但它不适用于obj列表.
let query f=
seq{
let cmd = new OleDbCommand( "SELECT * FROM F" );
let conn = new OleDbConnection( @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=D:\Users\df\Documents\Vfolio.accdb;
Persist Security Info=False;" )
conn.Open()
let DAdapt = new OleDbDataAdapter("SELECT * FROM F",conn)
let DTab = new DataSet()
let i= DAdapt.Fill(DTab)
let rowCol = DTab.Tables.[0].Rows
let rowCount = rowCol.Count
for i in 0 .. (rowCount - 1) do
yield f (rowCol.[i])
}
let u= query(fun row -> row.[0])
let a= List.ofSeq u
let v=query(fun row -> row.[1]) …Run Code Online (Sandbox Code Playgroud)