0

虽然我从过去十年一直在使用 SQL Server、Oracle,但我被要求对 PostgreSQL 进行一些研究,经过一些初步调查,很明显我现在正坚持使用 Function 从 PostgreSQL 数据库中检索数据。

使用以下代码检索数据并出现错误('错误 [26000] 错误:准备好的语句“mytabletest”不存在;'执行查询时出错)


代码片段

    Dim oDBCommand As DbCommand = GetDBCommand(oConnectionType, "mytabletest", CommandType.StoredProcedure)
    Dim dstResults As DataSet = GetDataSet(ConnectionTypes.ODBC, oDBCommand)


Public Function GetDataReader(dbType As ConnectionTypes, command As DbCommand) As DbDataReader

    Try

        Dim oConnection As DbConnection = GetDBConnection(dbType)

        Dim oDBTransaction As DbTransaction = oConnection.BeginTransaction
        command.Connection = oConnection
        command.Transaction = oDBTransaction


   'GETTING ERROR ON FOLLOWING LINE
        'ERROR [26000] ERROR: prepared statement "mytabletest" does not exist;
        'Error while executing the query
        return command.ExecuteReader()


    Catch ex As Exception
        Throw ex
    Finally
    End Try

    Return Nothing

End Function

我目前正在处理的环境如下:-

32位机。
视觉工作室 2010 + SP1
ODBC 提供程序:PostgreSQL Unicode 9.01.02.00
ADO.Net (System.Data.Odbc)

请注意,我愿意接受任何建议,即如果我完全做错了或部分做错了等等。请随时写信。

为了方便您创建相同的环境,请使用下表/函数定义。

--- Simple table to make things easier to understand. <br>
CREATE TABLE mytable
(
  messagetypeid integer NOT NULL,
  messagetype character varying(100) NOT NULL
) 



-- Function to retrieve data. <br>
CREATE OR REPLACE FUNCTION mytabletest()  <br>
   RETURNS SETOF refcursor AS $$
    DECLARE 
    ref1 refcursor; 
    BEGIN
      OPEN ref1 FOR SELECT * FROM mytable;
      RETURN NEXT ref1;                                                                               
    END;
    $$ LANGUAGE plpgsql;

请注意:

If I use <br>
  Dim oDBCommand As DbCommand = GetDBCommand(oConnectionType, "SELECT * FROM mytable", CommandType.Text) 

然后系统设法从数据库中检索信息而没有任何问题,但是,正如我所提到的,一旦我们使用“功能”,它就会引发异常。


在我从互联网上搜索任何解决方案失败的努力中,有人提到应该用小写创建表,所以为了它,我用小写重新创建,但是问题仍然存在。

4

1 回答 1

0

我不熟悉,.net但我怀疑你的意思更像:

GetDBCommand(oConnectionType, "SELECT myfunc()", CommandType.Text)

或者在SETOF功能等的情况下。

GetDBCommand(oConnectionType, "SELECT * FROM myfunc()", CommandType.Text)

PostgreSQL 本身没有“存储过程”。它确实有functions,而且我相信客户端/服务器协议有一种准备语句的方法,然后可以使用不同的变量多次执行这些语句(以节省解析 SQL 的成本),但这应该通过您的客户端库公开。

于 2013-04-12T11:25:33.033 回答