我在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!)
答案 0 :(得分:1)
一个可能的原因是,智能感知线程可能会超时,等待来自SQL提供程序的响应。
延迟(当您键入ResultSet
时)计算存储的proc和用于携带结果.
的类型集。这从某种意义上讲是很好的,因为这意味着提供程序不会在实例化时对整个数据库进行内省,而会引入很多您可能不会使用的东西。但是,这确实有副作用,需要在第一个请求的.
完成中完成大量工作,然后我们将结果缓存。我相信微软有一个度量标准,规定任何智能感知工作都应在250毫秒内完成,但是我不确定实际的线程超时时间是多少。在大型解决方案中,使用C#和F#这样的语言达到250ms的响应目标可能是一个很大的问题,但是将数据库(甚至是小型本地数据库)混合在一起,这将成为一个很难实现的目标。
为什么它无法恢复,并在添加引用之前再试一次,只有Visual Studio才能知道。但是通常,仅关闭并重新打开文件就足够了。在极少数情况下,从解决方案中卸载项目并重新加载。