虽然我过去十年一直在使用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>
答案 0 :(得分:0)
我不熟悉.net
,但我怀疑你的意思更像是:
GetDBCommand(oConnectionType, "SELECT myfunc()", CommandType.Text)
或者SETOF
函数等。
GetDBCommand(oConnectionType, "SELECT * FROM myfunc()", CommandType.Text)
PostgreSQL没有'存储过程'。它确实有functions
我相信客户端/服务器协议有一个方法来准备语句,然后可以使用不同的变量多次执行(以节省解析SQL的成本),但这应该暴露通过您的客户端库。