使用ADO.Net“System.Data.Odbc”(VB.Net)从PostgreSQL数据库中检索数据

时间:2013-04-12 10:28:07

标签: postgresql unicode ado.net odbc

虽然我过去十年一直在使用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 Bit Machine. 
Visual Studio 2010 + SP1 
ODBC Prodiver: 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) 

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


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

1 个答案:

答案 0 :(得分:0)

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

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

或者SETOF函数等。

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

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