2011-07-11 103 views
0

我想在devart實體模型,在這裏我想回到「自定義」表導入PostgreSQL的功能,但我不能讓它工作添加PostgreSQL函數

我定義我的功能是這樣的:

CREATE OR REPLACE FUNCTION "GetJournalEntriesByVoucherId"(bigint) 
    RETURNS SETOF record AS 
$BODY$ 
SELECT 
    JE."JournalEntryID" 
    JE."Amount", 
    JE."EntryText", 
FROM 
    "JournalEntries" AS JE 
WHERE 
    JE."FK_Voucher"=$1 
$BODY$ 
    LANGUAGE sql VOLATILE STRICT 
    COST 100 
    ROWS 1000; 
ALTER FUNCTION getjournalentriesbyvoucherid(bigint) OWNER TO sqluser; 

和使用http://www.devart.com/forums/viewtopic.php?p=71252在崗位#2的步驟,但我得到的錯誤信息

數據讀取器與指定Model.Entity1不兼容。 JournalEntryID類型的成員在數據讀取器中沒有相應的列,名稱相同「

+0

是否SELECT查詢工作,如果你直接執行它,而無需存儲過程? – Flimzy

+0

是的,它返回想要的結果 –

+0

定義存儲過程或調用它時會出現此錯誤嗎?如果在調用它的時候,你能粘貼你正在執行的調用存儲過程的確切查詢嗎? – Flimzy

回答

1

我經常使用OUT變量來設置返回的存儲過程,所以我沒有知道這是否會在你的情況有所幫助,但你可以試試它。老實說,我不知道這是否改變了功能的工作方式,或只是它的定義方式...

CREATE OR REPLACE FUNCTION "GetJournalEntriesByVoucherId"(BIGINT, 
    JournalEntryID OUT DATATYPE, 
    Amount OUT INT, 
    EntryText OUT VARCHAR, 
) 
RETURNS SETOF record AS 
$BODY$ 
.... 
+0

好吧,它改變了導入方式識別返回類型的方式(它現在「正確」),但仍然出現數據讀取器錯誤。 –

+0

有趣的是,如果我繼續回實體與字符串類型的字段返回值,它實際上在那裏的對象返回值將返回行「(JournalEntryID.value,Amount.value,EntryText.value)」作爲一個字符串.. –

+0

我設法通過創建一個自定義類型來解決我的問題,該類型與我的查詢結果具有相同的字段,並讓函數的結果成爲「setof theType」,然後使數據讀取器工作。 我會在4小時內發佈答案,當我允許的時候 –

0

@Flimzy是正確的。
當函數返回SETOF記錄從函數返回讀取器包含在窗體的記錄「(field1.Value,...,fieldk.Value)」,並視爲varchar。
當輸出參數指定,這些參數的名稱和類型,讓​​服務器知道哪些字段是讀者,和值正確返回。我們已經在最新的5.30.180版本中解決了這種情況下的一些錯誤,現在它可以工作。
與強類型SETOF(CompositeType中)的解決方案是一個適當的爲好。