2011-07-11 102 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中)的解决方案是一个适当的为好。