通过F#和Npgsql在Postgresql中调用存储过程

时间:2013-06-03 22:59:13

标签: postgresql f# npgsql type-providers

我试图使用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类型的表,而不是任何存储过程。有没有办法通过类型提供程序以静态类型的方式使用存储过程,而不是只调用原始查询字符串?

2 个答案:

答案 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之间看起来不支持。你在这里得到一个好答案的机会是非常低的,因为它需要一个对这种语言有深刻理解的人,它的架构,以及每个拼图所依赖的地方。它可能还需要调试才能看出出了什么问题。

以前的建议是:

  1. 由于PostgreSQL本身并没有真正的存储过程,因此F#可能无法识别它们,并且

  2. npgsqltypes可能缺少映射的一些重要方面。

  3. 我希望npgsql不会在我开始看这个的地方,因为理论上,类型提供者应该能够自己进行查找。

    因此,我建议您访问相关的电子邮件列表并询问此问题,假设它是您的类型提供商的问题。知道足以排除故障的人可能会在这些电子邮件列表中。