2016-12-28 46 views
1

我正在使用Oracle.ManagedDataAccess從我的數據庫返回數據,而且我真的需要分頁結果,因爲此表中有很多寄存器。OracleDataReader僅返回分頁查詢的最後一行

所以我使用第二個答案從this後分頁,它真的工作,當我在Oracle客戶端上運行。

最終的查詢看起來是這樣的:

select * 
from (
    select rownum as rn, a.* 
    from (
      Select u.* 
      From users u 
      order by u.user_code 
     ) a 
    ) 
where rownum <= :myReturnSize 
and  rn > (:myReturnPage-1) * :myReturnSize; 

Oracle client result

但是,當我把它從下面的Net代碼,它返回只有100的我問的最後一個寄存器。

OracleParameter[] parameters = new OracleParameter[]{ 
    new OracleParameter("myReturnPage", page), //1 
    new OracleParameter("myReturnSize", size) //100 
}; 

List<User> usersList = new List<User>(); 

using (OracleConnection conn = new OracleConnection(connString)) 
{ 
    using (OracleCommand cmd = new OracleCommand(sbSelect.ToString(), conn)) 
    { 
     conn.Open(); 
     cmd.CommandType = CommandType.Text; 
     cmd.Parameters.AddRange(parameters); 

     using (OracleDataReader odr = cmd.ExecuteReader()) 
     { 
      if (!odr.IsClosed && odr.HasRows) 
      { 
       while (odr.Read()) 
       { 
        User userToReturn = new User(); 
        FillUserEntity(userToReturn, odr); 
        usersList.Add(userToReturn); 
       } 
      } 
     } 
    } 
} 

return usersList.AsQueryable(); 

.Net return

更爲離奇的是,當我在相同的方法,無需分頁運行此查詢將返回我所有的寄存器,超過723000。

Select * return

任何幫助,將不勝感激。

非常感謝。

回答

3

默認情況下,ODP.Net按位置而不是按名稱設置參數。所以,你只需要反轉創建的OracleParameter的數組時的順序,還設置BindByName屬性爲true,像這樣:

cmd.BindByName = true; 
1

Oracle傾向於比直接文本更喜歡存儲過程(因爲原因)。我有更多的「它在SQL Developer中工作,但不是.Net!」通過將它們放在數據庫端的包中的存儲過程中解決的情況。這也將你的查詢從應用程序中分離出來,因此如果查詢必須更改,則不必重新編譯應用程序。然後,您的應用程序就可以像以前一樣調用相同的調用,但可能使用OracleDataAdapter訪問存儲過程。

+0

謝謝你的快速回復,但這不是我的情況下,相對於程序創建。如果我需要更改查詢,我將通過一個發佈過程,如果我需要重新編譯proc或應用程序,這沒有任何區別。 –

+0

此外,我在文本中使用參數的其他方法,像魅力一樣工作,所以我認爲這不是我的問題。不過謝謝你的時間。 –

1

您能確認您是否查詢從Oracle客戶端提供正確的輸出。

問題是與 其中ROWNUM < =:myReturnSize 它將總是返回值的rownum =:myReturnSize

一種可能的解決方案可以是

SELECT * 從( 選擇ROWNUM作爲RNUM,一個* 從( 選擇ROWNUM爲RN,U * 從用戶ü 爲了通過u.user_code )一 ) 其中rnum < =:myReturnSize 和rn>(:myReturnPage-1)*:myReturn。

+0

我的答案不正確,可能是因爲我是從移動應用發佈。 – Subhroneel

+0

謝謝你的回覆。從這個原則開始,我想出了一些瘋狂的原因,Oracle.ManagedDataAccess.Client正在改變參數。我想,因爲當我問起時,.Net只是給我寄了最後一個寄存器,然後回答第一個寄存器。所以我改變了它的值,並且它工作。 –