2009-08-17 60 views
0

DataReader是否正常地從查詢中無序返回行?.NET DataReader和ORDER BY

我從一個PostgreSQL 8.3.7數據庫抓取了一些行和正在使用ORDER BY,LIMIT和OFFSET如下:

SELECT id, name 
FROM tbl_foo 
ORDER BY name 
LIMIT 10 OFFSET 0; 

如果我運行此查詢手動的結果進行排序,然後第一十行被返回,這是我所期望的。

如果我使用PostgreSQL的第三方ADO.NET提供程序(http://www.devart.com/dotconnect/postgresql/)運行相同的查詢,則行不會以相同的順序返回。這可能是第三方提供商的一個問題,我在他們的論壇上發佈了一篇關於此問題的文章。

我試過用DataTable.Fill()加載行,並通過它們與DataReader.Read()循環。在任何一種情況下,他們都沒有以正確的順序出現。

我想我也會在這裏查看,看看有沒有人經歷過與DataReaders相同的行爲。

回答

0

今天早上又回到了一個新的問題,並經常發生的答案立即出現了答案。

出於習慣我使用參數來設置查詢中我的ORDER BY,LIMIT和OFFSET的值。後面的兩個工作正常,但通過參數設置,但ORDER BY不,可能是因爲它被轉換爲字符串文字。

爲了感興趣,我測試了LIMIT和OFFSET,他們將接受字符串文字而不是INTEGER。

我想我需要使用字符串連接的ORDER BY。

1

DataTable可以通過View對其進行一些排序,但如果DataReader將它們按順序返回,那麼提供程序(或您的查詢)肯定有問題。

+1

謝謝,這就是我正在尋找的東西。然後,我會等待供應商的回覆。 對於什麼值得我不想做客戶端排序,因爲我不得不將所有數據都帶回客戶端,即使我只顯示10行。 事實上,目前有問題的應用程序確實在使用DataViews對ASP進行排序和分頁時遇到了這個問題,並且在將其更改爲在數據庫服務器上進行分頁和排序時遇到了此問題。 – 2009-08-17 20:40:11

+0

科裏,你是對的,這是LIMIT和類似的意思。 – 2009-08-17 21:11:44

0

我不知道的Postgres或Devart驅動程序,但我可以證實,在SQL Server(2000以上),如果你指定一個ORDER BY(像你一樣),那麼這些行在返回由SqlDataReader指定的順序。我每天依靠那個! :-)

馬克

+0

太棒了,我不想找到要測試的SQL Server安裝。如果SqlClient的行爲如此,那麼我認爲其他提供者應該以這種方式行事,並向供應商提出錯誤。 – 2009-08-17 20:54:16

4

聽起來與供應商的問題,只要確保你訂購的列通過給出你期望例如行的判斷結果與

 
id | Name 
1 | John 
2 | Peter 
3 | John 

一個表,並通過在名稱列的順序可能不會產生整個查詢同一行的順序。它可能產量

 
1 | John  3 | John 
3 | John or 1 | John 
2 | Peter  2 | Peter 
+0

我沒有在我的問題中指定,但是指定的實體是政府部門的分支,所以他們的名字總是獨一無二的,但是感謝你的例子。 – 2009-08-17 20:53:00