2012-02-07 24 views
1

我有一個返回引用遊標的過程。它需要4個參數,我正在使用C#。我已經看過了所有的過網例子,但不能得到其中的任何工作你如何使用Oracle ODP.net ExecuteReader與SP在C#中返回遊標?

這是我

public static int test(int test_id, int progr, int setID, string BFilter) 
{ 
    object cur1 = System.DBNull.Value; 
    string spname = "SP.GetValues"; 

    using (Oracle.DataAccess.Client.OracleCommand command = DB.GetStoredProcCommand(spname, test_id, progr, setID, BFilter, cur1)) 
    { 
    using (OracleDataReader reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
     //load array 
     } 
    } 
    } 

    int t = 1; 
    return t; 
} 

我用它工作得很好數據集,除了它正在採取20秒,每次得到500行,我必須做800次。我認爲使用數據讀取器,將數據加載到數組中,然後在數組上循環會比讀入數據集更快。 SP本身需要1秒才能返回,它在填充線上花費19秒。

+0

@ user72226 - 如果問題是性能而不是功能,是否嘗試從SQL * Plus中的遊標提取? Oracle甚至可以在開始執行查詢之前打開遊標,因此完全可以快速打開遊標,但是當您開始讀取數據時,實際執行查詢需要時間。 – 2012-02-07 18:13:08

+0

試過了,它在一秒鐘之內完成。延遲是填充C#端的數據集。我想測試一個datareader會更快,但找不到任何示例。 – user722226 2012-02-07 18:54:44

回答

0

當使用Oracle參考遊標時,Mark William的博客中有一個neat article on using "fetch size" to increase performance。非常有趣的閱讀,可能是一個開始樣本的好地方。

它有點老了(我作爲承認,幾年沒有觸及ODP.NET),但是我懷疑ODP.NET已經從根本上改變了它的位置。

+0

有趣的提示,但依靠使用不受支持的黑客。這將在生產環境中使用,這將使任何故意使用不受支持的特性的理由終止! – user722226 2012-02-08 10:39:52

+0

我將不得不查看是否可以挖掘我在上次使用ODP和ref遊標時使用的代碼。我可以想象它仍然是合適的(儘管甲骨文公司已經完全重新發布新版本)。 – 2012-02-10 16:30:52

+0

因爲Rowsize現在是OracleDataReader的官方屬性,所以不再需要在Mark Williams的博客中進行破解。請記住,ODP.NET向後支持較舊的Oracle數據庫版本,例如ODP.NET 11.2支持Oracle 9.2。所以沒有必要停留在ODP.NET的古老版本上。 – 2012-03-16 08:18:22

0

您需要指定該參數爲ref類型的輸出參數。光標, 檢查以下鏈接的更多詳細信息:ODP.NET in-out Curors

相關問題