2012-09-26 28 views
1

對情況的簡短描述。SqlDataAdapter在SQL Server 2012中返回意外的行

一個Web應用程序,用戶可以選擇一些搜索條件,點擊搜索按鈕並查看網格中顯示的結果。

此應用程序在我們的開發服務器上按預期工作。但是,當部署在客戶的服務器上時,網格的分頁被破壞:第一頁是正確的,但接下來的頁面不會返回正確的行。我只能解釋用一個例子會發生什麼:

假設第1頁應顯示結果1-10頁2個結果11-20等

會發生什麼情況是這樣的:第1個顯示1-10第2個顯示1,2,3,4,,,9,28,29,30頁3所示1,2,3,28,29,36,37,..

所以行被搞砸了,很多結果都不會顯示(取而代之的是前一頁的結果)。另外請注意,行不僅僅是某個數字。

經過許多小時的搜索和調試,我只能斷定正在使用的SqlDataAdapter的Fill()方法返回錯誤的結果!該適配器使用SqlCommand,並將SQL查詢作爲純文本。我可以在SQL Server Management Studio中運行這個查詢,在那裏它返回正確的結果,所以它確實必須在.NET框架本身內部出錯。

我試圖使.NET源代碼調試步入填充方法,但我不能得到那個工作,所以基本上我是沒辦法了現在..

任何提示/建議非常感謝!

<問題就解決了,見下面的回答>

+0

您確定表格結構與開發環境中的表格完全相同嗎?我的意思是主鍵,數據類型等。 –

+0

昨天我們從客戶那裏將數據庫傳送到我們的開發環境,然後才發現應用程序在我們自己的服務器上正常工作。 – Hanno

+0

分頁結果的標準是什麼 - 可能是排序規則/本地化問題,例如日期時間被自動轉換爲不同的格式,例如字符串在一臺服務器上不區分大小寫,而在另一臺服務器上不區分大小寫?鑑於每臺服務器上的設置,它可以解釋奇怪的結果? – bUKaneer

回答

0

我已經找到了問題的原因。 SQL查詢手動實現分頁(不要問我爲什麼,我沒有寫代碼,我只需要維護它;-))。 使用下面的語句:

("DELETE FROM #tmp WHERE AccountId IN (SELECT TOP {0} AccountId FROM #tmp);", request.PageStart) 
("SELECT DISTINCT TOP {0} ", request.NumRecords); 

的#tmp表在前面的語句創建,與特定的ORDER BY子句。由於#tmp表已經排序,所以您會希望delete語句會刪除正確的頂部記錄。但顯然,當將SqlDataAdapter與SQL Server 2012數據庫結合使用時,順序不再正確應用。在添加與創建#tmp表的查詢相同的order by子句之後,問題就解決了。 還剩下一個問題:這是一個錯誤還是一個功能?