F#SqlProvider - 如何访问存储过程结果?

时间:2018-05-14 08:54:53

标签: f# type-providers

我在F#项目中使用来自NuGet(https://www.nuget.org/packages/SQLProvider/ v1.1.42)的SQLProvider来访问我们的MSSQL数据库。

我指的是此处的示例代码,https://fsprojects.github.io/SQLProvider/core/programmability.html以及GitHub上的源代码测试,https://github.com/fsprojects/SQLProvider/blob/master/tests/SqlProvider.Tests/scripts/MySqlTests.fsx

#r @"....\packages\SQLProvider.1.1.42\lib\net451\FSharp.Data.SqlProvider.dll"
#r @"....\System.Data.Linq.dll"

open System
open FSharp.Data.Sql
open FSharp.Data.Sql.Common
open System.Data.Linq

type SeriesResult = { .. fields .. }

[<Literal>]
let ConnectionString = @"connStr"

type Sql = SqlDataProvider<
                    ConnectionString = ConnectionString,
                    DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER>

let db = Sql.GetDataContext()

let test = 
    [
        for f in db.Procedures.MyStoredProcedure.Invoke("param").ResultSet do
            yield f.MapTo<SeriesResult>()
    ]

我需要访问MyStoredProcedure调用的结果,但ResultSet错误error FS0039: The field, constructor or member 'ResultSet' is not defined"。我也为ColumnValues和MapTo得到了这个(大概是因为类型未知)。

我应该引用一个额外的库吗?

我有:FSharp.Core,FSharp.Data,FSharp.Data.SqlProvider,mscorelib,System,System.Core,System.Data,System.Data.Linq,System.Xml.Linq

谢谢!

(想用SQLProvider标记 - 但可以&#39; t!)

1 个答案:

答案 0 :(得分:1)

一个可能的原因是,智能感知线程可能会超时,等待来自SQL提供程序的响应。

延迟(当您键入ResultSet时)计算存储的proc和用于携带结果.的类型集。这从某种意义上讲是很好的,因为这意味着提供程序不会在实例化时对整个数据库进行内省,而会引入很多您可能不会使用的东西。但是,这确实有副作用,需要在第一个请求的.完成中完成大量工作,然后我们将结果缓存。我相信微软有一个度量标准,规定任何智能感知工作都应在250毫秒内完成,但是我不确定实际的线程超时时间是多少。在大型解决方案中,使用C#和F#这样的语言达到250ms的响应目标可能是一个很大的问题,但是将数据库(甚至是小型本地数据库)混合在一起,这将成为一个很难实现的目标。

为什么它无法恢复,并在添加引用之前再试一次,只有Visual Studio才能知道。但是通常,仅关闭并重新打开文件就足够了。在极少数情况下,从解决方案中卸载项目并重新加载。