F#SqlProvider-如何访问存储过程结果?
我在一个F#项目中使用NuGet(v1.1.42)的SQLProvider访问我们的MSSQL数据库 我指的是这里的示例代码,以及GitHub上的源代码测试F#SqlProvider-如何访问存储过程结果?,f#,type-providers,F#,Type Providers,我在一个F#项目中使用NuGet(v1.1.42)的SQLProvider访问我们的MSSQL数据库 我指的是这里的示例代码,以及GitHub上的源代码测试 #r@“…\packages\SQLProvider.1.1.42\lib\net451\FSharp.Data.SQLProvider.dll” #r@“…\System.Data.Linq.dll” 开放系统 打开FSharp.Data.Sql 打开FSharp.Data.Sql.Common 开放系统.Data.Linq 类型Seri
#r@“…\packages\SQLProvider.1.1.42\lib\net451\FSharp.Data.SQLProvider.dll”
#r@“…\System.Data.Linq.dll”
开放系统
打开FSharp.Data.Sql
打开FSharp.Data.Sql.Common
开放系统.Data.Linq
类型SeriesResult={..fields..}
[]
让ConnectionString=@“connStr”
类型Sql=SqlDataProvider<
ConnectionString=ConnectionString,
DatabaseVendor=Common.DatabaseProviderTypes.MSSQLSERVER>
让db=Sql.GetDataContext()
让测试=
[
对于db.Procedures.MyStoredProcedure.Invoke(“param”).ResultSet do中的f
产量f.MapTo()
]
我需要访问MyStoredProcess调用的结果,但是ResultSet
错误与错误FS0039:字段、构造函数或成员“ResultSet”未定义“
。我还为ColumnValues和MapTo获取此结果(可能是因为类型未知)
有没有其他我应该参考的图书馆
我有:FSharp.Core、FSharp.Data、FSharp.Data.SqlProvider、mscorelib、System、System.Core、System.Data、System.Data.Linq、System.Xml.Linq
谢谢
(想用SQLProvider标记,但不能!)一个可能的原因是intelli sense线程可能在等待SQL提供程序的响应时超时 存储的过程和携带结果集的类型集
ResultSet
是延迟计算的(当您键入
时)。这在某种程度上是好的,因为这意味着提供程序不会在实例化时对整个数据库进行内省,引入许多您可能不会使用的内容。但是,它确实有副作用,即在第一个请求完成时,需要在
中做大量的工作,我们会在之后缓存结果。我相信icrosoft有一个指标表明,任何intelli sense工作都应该在250ms内完成,但我不确定实际的线程超时是多少。对于C#和F#这样的语言,达到250ms的响应目标可能是大型解决方案的一个大问题,但如果将数据库混入其中(即使是一个小型本地数据库),这将成为一个很难达到的目标
只有Visual Studio知道它为什么在添加引用之前没有恢复并重试,但通常情况下,关闭并重新打开文件就足够了。在极少数情况下,从解决方案中卸载项目并重新加载。这很奇怪……我为每个引用的DLL添加了一个打开,Visual Studio终于识别了d结果集。想知道它是哪一个引用,我把它们全部删除了——从那以后它一直在工作!即使在多次清理和删除垃圾箱之后,这可能只是一个VS怪癖。如果有人能对此有所了解,我仍然感兴趣,因为这似乎与F#很常见。
#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>()
]