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

通过F#和Npgsql调用Postgresql中的存储过程,postgresql,f#,npgsql,type-providers,Postgresql,F#,Npgsql,Type Providers,我试图使用Npgsql类型提供程序从F#调用postgresql中的存储过程 目前,我已按如下方式连接到数据库: 开放系统 开放系统.数据 开放系统.Data.Entity 开放系统.Data.Linq 打开Microsoft.FSharp.Data.TypeProviders 打开Microsoft.FSharp.Linq 打开Npgsql 打开NpgsqlTypes 键入内部dbSchema=SqlEntityConnection 让内部db=dbSchema.GetDataContext(

我试图使用Npgsql类型提供程序从F#调用postgresql中的存储过程

目前,我已按如下方式连接到数据库:

开放系统
开放系统.数据
开放系统.Data.Entity
开放系统.Data.Linq
打开Microsoft.FSharp.Data.TypeProviders
打开Microsoft.FSharp.Linq
打开Npgsql
打开NpgsqlTypes
键入内部dbSchema=SqlEntityConnection
让内部db=dbSchema.GetDataContext()

但是,我只看到
db
类型上的表,没有看到任何存储过程。是否有一种方法可以通过类型提供程序以静态类型的方式使用存储过程,而不仅仅是调用原始查询字符串?

从您看到的情况来看,似乎在npgsql、f#和npgsqltypes之间的某个地方不支持这种方法。你在这里得到一个好答案的机会很低,因为这需要有人对这门语言、它的架构以及每一块拼图的确切位置有深刻的理解。它可能还需要调试以查看出了什么问题

以前的建议是:

  • 由于PostgreSQL本身并没有存储过程,F#可能无法识别它们,并且

  • npgsqltypes可能缺少映射的一些重要方面

  • 我希望npgsql不会是我开始考虑的地方,因为理论上,类型提供程序应该能够自己进行查找


    因此,我建议您登录相关的电子邮件列表,并询问相关问题,假设这是您的类型提供商的问题。任何知道如何排除故障的人都可能会出现在这些电子邮件列表中。

    我知道这个问题很久以前就被问到了,但我想我应该添加一个对该问题的参考。它最近增加了对PostgreSQL的支持,包括对存储过程的支持

     [<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
         ]
    
    []
    让connStr=“User ID=postgres;Password=Password;Host=POSTGRESQL;Port=9090;Database=hr;”
    []
    让resolutionFolder=@“D:\Downloads\Npgsql-2.1.3-net40”
    类型HR=SqlDataProvider
    设ctx=HR.GetDataContext()
    ctx.程序.添加作业历史(100,日期时间(1993,1,13),日期时间(1998,7,24),“IT程序”,60)
    //支持返回ref游标的存储过程
    让员工=
    [
    对于ctx.Functions.GET_EMPLOYEES()中的e.ReturnValue do
    产量e
    ]
    

    其中resolution文件夹指向NPGSQL.NET程序集的位置

    我对F#etc不太了解,无法给出真正的答案,但我怀疑问题在于Pg实际上没有存储过程。它设置了返回函数,这些函数通常被当作存储过程来使用,但是没有真正的存储过程和
    调用
    函数。@CraigRinger我不明白为什么类型提供程序不能支持以强类型方式调用这些函数。@svick理论上你可以,但由于它们不是真正的存储过程,因此可能无法通过所述类型提供程序识别和公开它们。另一种可能的解释是npgsql可能无法实现公开函数所需的一些元数据。是否可以检查db对象调用哪个方法来获取函数列表?这将有助于我们了解npgsql中缺少的内容(如果缺少某些内容)。