我试图使用Npgsql类型提供程序从F#调用postgresql中的存储过程。
目前,我按如下方式连接到数据库:
open System
open System.Data
open System.Data.Entity
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq
open Npgsql
open NpgsqlTypes
type internal dbSchema = SqlEntityConnection<ConnectionString="**my connection string**", Provider="Npgsql">
let internal db = dbSchema.GetDataContext()
但是,我只看到db
类型的表,而不是任何存储过程。有没有办法通过类型提供程序以静态类型的方式使用存储过程,而不是只调用原始查询字符串?
答案 0 :(得分:2)
我知道此问题是在不久前提出的,但我想我会添加对SqlProvider的引用。这最近支持PostgreSQL添加到它,它包括对SPROCS的支持。
[<Literal>]
let connStr = "User ID=postgres;Password=password;Host=POSTGRESQL;Port=9090;Database=hr;"
[<Literal>]
let resolutionFolder = @"D:\Downloads\Npgsql-2.1.3-net40\"
type HR = SqlDataProvider<ConnectionString=connStr,DatabaseVendor=Common.DatabaseProviderTypes.POSTGRESQL, ResolutionPath = resolutionFolder>
let ctx = HR.GetDataContext()
ctx.Procedures.ADD_JOB_HISTORY(100, DateTime(1993, 1, 13), DateTime(1998, 7, 24), "IT_PROG", 60)
//Support for sprocs that return ref cursors
let employees =
[
for e in ctx.Functions.GET_EMPLOYEES().ReturnValue do
yield e
]
其中resolution文件夹指向NPGSQL .NET程序集的位置。
答案 1 :(得分:0)
从您看到的情况看,在npgsql,f#和npgsqltypes之间看起来不支持。你在这里得到一个好答案的机会是非常低的,因为它需要一个对这种语言有深刻理解的人,它的架构,以及每个拼图所依赖的地方。它可能还需要调试才能看出出了什么问题。
以前的建议是:
由于PostgreSQL本身并没有真正的存储过程,因此F#可能无法识别它们,并且
npgsqltypes可能缺少映射的一些重要方面。
我希望npgsql不会在我开始看这个的地方,因为理论上,类型提供者应该能够自己进行查找。
因此,我建议您访问相关的电子邮件列表并询问此问题,假设它是您的类型提供商的问题。知道足以排除故障的人可能会在这些电子邮件列表中。