2013-06-03 3 views
5

Я пытаюсь вызвать хранимую процедуру в postgresql из F # с помощью поставщика типа Npgsql.Вызов хранимой процедуры в Postgresql через F # и Npgsql

В настоящее время я подключен к базе данных следующим образом:

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

Я не знаю, F # и т. Д. Достаточно, чтобы дать реальный ответ на это, но я подозреваю, что проблема в том, что Pg на самом деле не хранит процедуры. Он имеет функции set-return, которые часто используются так, как если бы они были хранимыми процедурами, но нет реальной хранимой процедуры proc и 'CALL'. –

+0

@CraigRinger Я не понимаю, почему провайдеру типа не удалось называть их строго типизированным способом. – svick

+0

@svick В теории вы можете, но поскольку они не являются истинными хранимыми процедурами, они не могут быть распознаны и выставлены через поставщика указанного типа. –

ответ

0

Из взгляда вы видите, что это не поддерживается где-то между npgsql, f # и npgsqltypes. Вероятность того, что вы получите хороший ответ здесь, очень низок, потому что для этого потребуется кто-то с сильным пониманием этого языка, его архитектуры и где именно каждая часть головоломки полагается. Также может потребоваться отладка, чтобы увидеть, что происходит неправильно.

Предыдущие предложения были:

  1. Поскольку PostgreSQL не действительно хранимые процедуры сами по себе, F # не может распознать их, и

  2. npgsqltypes могут быть отсутствуют некоторые важные аспекты, касающиеся отображения ,

Я бы ожидать, что npgsql не будет, где я начал бы смотреть на это, потому что, в теории, провайдер типа должен быть в состоянии сделать сам поиск.

Таким образом, я бы рекомендовал получать соответствующие списки рассылки и спрашивать об этом при условии, что это проблема с поставщиком вашего типа. Любой, кто знает, что нужно для устранения неполадок, вероятно, будет в этих списках адресов электронной почты.

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.