标签: fsharp.data.sqlclient

如何在fsharp.data.sqlclient中使用SQL IN语句?

我有以下示例代码.目标是使用多个输入参数运行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的文档中找到任何相关的示例.请帮忙!

f# fsharp.data.sqlclient

14
推荐指数
1
解决办法
974
查看次数

使用app.config中的connectionstring和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如果必须提供连接字符串,我无法达到目的.另外你为什么要指定它两次.对我来说没什么意义:(

f# f#-data fsharp.data.sqlclient

8
推荐指数
1
解决办法
1034
查看次数

具有多种选项类型的 F# 过滤记录

好吧,奇怪的问题在这里。我正在使用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)

f# f#-data fsharp.data.sqlclient

4
推荐指数
1
解决办法
663
查看次数

使用查询表达式与Seq模块?

在操作通过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?

linq f# fsharp.data.sqlclient

2
推荐指数
1
解决办法
179
查看次数

F锐利添加清单

如何将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)

f# f#-interactive f#-data fsharp.data.sqlclient

1
推荐指数
1
解决办法
134
查看次数