2013-06-03 23 views
5

Tôi đang cố gắng gọi một thủ tục được lưu trữ trong postgresql từ F # bằng cách sử dụng nhà cung cấp kiểu Npgsql.Gọi thủ tục lưu sẵn trong Postgresql thông qua F # và Npgsql

Hiện nay, tôi đang kết nối với cơ sở dữ liệu như sau:

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() 

Tuy nhiên, tôi chỉ nhìn thấy các bảng vào loại db, không phải bất kỳ thủ tục lưu trữ. Có cách nào để sử dụng các thủ tục được lưu trữ theo cách được gõ tĩnh thông qua nhà cung cấp kiểu, thay vì chỉ gọi chuỗi truy vấn thô?

+0

Tôi không biết F # vâng đủ để đưa ra câu trả lời thực sự về điều này, nhưng tôi nghi ngờ vấn đề là Pg không thực sự có các thủ tục được lưu trữ. Nó có các hàm set-return thường được sử dụng như thể chúng được lưu trữ thủ tục, nhưng không có một proc thực sự được lưu trữ và hàm 'CALL'. –

+0

@CraigRinger Tôi không thấy lý do tại sao nhà cung cấp loại không thể hỗ trợ gọi những người đó theo cách được đánh máy mạnh mẽ. – svick

+0

@svick Về lý thuyết bạn có thể, nhưng vì chúng không phải là các thủ tục được lưu trữ thực sự, chúng có thể không được nhận dạng và hiển thị thông qua nhà cung cấp loại đã nói. –

Trả lời

0

Từ giao diện bạn đang thấy, có vẻ như điều này không được hỗ trợ ở đâu đó giữa npgsql, f # và npgsqltypes. Cơ hội bạn nhận được câu trả lời hay ở đây là rất thấp vì nó đòi hỏi ai đó hiểu biết sâu sắc về ngôn ngữ này, kiến ​​trúc của nó, và chính xác từng phần của câu đố dựa vào đâu. Nó cũng có thể yêu cầu gỡ lỗi để xem những gì đang xảy ra.

Các đề xuất trước đây là:

  1. Kể từ PostgreSQL không thực sự đã được lưu trữ thủ tục cho mỗi gia nhập, F # có thể không nhận ra chúng, và

  2. npgsqltypes có thể bị thiếu một số khía cạnh quan trọng trên bản đồ .

Tôi mong rằng npgsql không phải là nơi tôi bắt đầu xem xét điều này bởi vì, về mặt lý thuyết, nhà cung cấp loại sẽ có thể tự tìm kiếm.

Vì vậy, tôi khuyên bạn nên nhận các danh sách email có liên quan và hỏi về điều này giả định đây là vấn đề với nhà cung cấp loại của bạn. Bất cứ ai biết đủ để khắc phục sự cố có thể sẽ nằm trong các danh sách email đó.

2

Tôi biết câu hỏi này được hỏi theo thời gian trước đây, nhưng tôi nghĩ tôi sẽ thêm tham chiếu đến số SqlProvider. Điều này gần đây đã hỗ trợ cho PostgreSQL được thêm vào nó và nó bao gồm hỗ trợ cho 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 
    ] 

Trường hợp thư mục phân giải trỏ đến vị trí của hội đồng NPGSQL .NET.

Các vấn đề liên quan