如何将“<unnamed portal 1>”转换为 VB.NET 中 plpgsql 函数的数据集

How convert '<unnamed portal 1>' to dataset of a plpgsql function in VB.NET

我正在学习一些 PostgreSQL 基础知识。当我尝试 return 从 PostgreSQL 存储函数到 VB.NET 应用程序时,我遇到了以下情况

##--- 我的 PostgreSQL 函数是
CREATE OR REPLACE FUNCTION checkLogin(
IN p_uname TEXT,IN p_pwd TEXT) RETURNS refCursor AS
$BODY$
    DECLARE ref refCursor;
    BEGIN
        OPEN ref FOR SELECT UserMaster.* FROM UserMaster WHERE username=p_uname AND userpwd=p_pwd AND coalesce(userdel,FALSE)=FALSE;
        RETUR ref;
    END;
$BODY$
LANGUAGE PLPGSQL
-- 我的 VB 函数 To return 数据集如下
Function CheckLogin(ByVal username As String,ByVal pwd As String) As DataSet
    Try

        Dim ds As New DataSet

        Dim conString As String="Server=localhost;port=5432;Database=myDB;UserId=postgres;password=postgres"
        Dim con As NpgsqlConnection=New NpgsqlConnection(ConString) 
        con.open()
        Dim com As NpgsqlCommand=New NpgsqlCommand("select * from checkLogin('"+ username +"','"+ pwd +"')",con)
        Dim da As NpgsqlDataAdapter=New NpgsqlDataAdapter(com)
        da.Fill(ds)
        Return ds
    Catch ex As Exception
        Return Nothing
    End Try
End Function

从这个函数开始,它只是 return 'unnamed portal 1' 在一个标签中 我的问题是如何将它转换成数据集。如果有人回答并提到我做错了什么,那真的很有帮助。我用谷歌搜索并阅读了大部分与此相关的文章。但是我没有找到合适的解决方案。如果有 link 请告诉我,请原谅这个问题。

提前致谢

如果您想要的是 return 一组行的函数(很像 table),那么您的函数应该 return 一个 table(参见 the docs, or this question 示例)而不是 refcursor。

refcursor 是一个服务器端对象,它允许您以特殊方式检索查询结果(例如,一次获取一定数量的行,将其重置)。如果您的函数 return 是一个 refcursor,您将需要按照 in the docs 所述发送进一步的查询来与其进行交互。您的用例似乎不能保证这种复杂性。

我像下面这样更改了我的存储函数

CREATE OR REPLACE FUNCTION checkLogin(
IN p_uname TEXT,IN p_pwd TEXT) RETURNS TABLE(uid INTEGER,uname CHARACTOR varying,utype integer) AS
$BODY$

    BEGIN 
        RETURN QUERY
        SELECT userId,userName,userType FROM UserMaster WHERE username=p_uname AND userpwd=p_pwd AND coalesce(userdel,FALSE)=FALSE;

    END;
$BODY$
LANGUAGE PLPGSQL

此 pgSQL 函数运行良好,returns 结果集可以轻松将其转换为数据集。