5

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

4

2 回答 2

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
     ]

解析文件夹指向 NPGSQL .NET 程序集的位置。

于 2014-08-27T14:09:49.833 回答
0

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

之前的建议是:

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

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

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

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

于 2013-09-21T10:52:37.077 回答