2013-04-12 82 views
0

儘管我一直在使用SQL Server,但是從最近十年來,我一直要求 對PostgreSQL做一些研究,之後一些初步調查顯示,我現在堅持使用Function從PostgreSQL數據庫中檢索數據。使用ADO.Net從「PostgreSQL數據庫」中檢索數據「VB.NET」

使用下面的代碼段來檢索數據和獲取錯誤 ( 'ERROR [26000] ERROR:製備語句 「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 

Environement我正在上以下內容: -

 
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) 

然後系統管理不過來檢索datbase信息沒有任何問題,因爲我一旦提到我們使用「Function」它會引發異常。


在我從互聯網搜索任何解決方案失敗的努力過程中,有人提到應該使用小寫創建表,所以只是爲了它我用小寫重新創建,但問題仍然存在。

回答

0

我不熟悉的.net但我懷疑你的意思更多的東西一樣:

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

或者在SETOF功能等的情況下..

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

PostgreSQL沒有「存儲過程」每策。它確實有functions,我相信客戶/服務器協議有一個準備語句的方法,然後可以使用不同的變量多次執行(以節省解析SQL的成本),但是這應該通過客戶端庫。

+0

克里斯,你是個明星! 非常感謝你的努力,使其能夠按預期工作。 這不是一個將函數定義傳遞給 命令對象的好方法,但是,我想我們沒有任何選擇,只能用 來使用你的建議。我花了將近一天才能到達現在的位置:(在這個特殊情況下,他們並沒有讓開發者更容易。 再一次,非常感謝您的意見。非常感謝。 –