2013-06-03 2 views
5

Npgsql 형식 공급자를 사용하여 F #에서 postgresql의 저장 프로 시저를 호출하려고합니다.F # 및 Npgsql을 통해 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

이 질문에 실제 답변을 드릴 수있는 F # 등은 잘 모르겠지만, 문제는 Pg에 실제로 저장 프로 시저가 없다는 것입니다. set-returning 함수는 저장 프로 시저 인 것처럼 자주 사용되지만 실제로 저장된 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 어셈블리의 위치를 ​​가리 킵니다.