1

状況の簡単な説明。

ユーザーがいくつかの検索条件を選択し、検索ボタンを押して、グリッドに表示される結果を確認できるWebアプリケーション。

このアプリケーションは、開発サーバーで期待どおりに機能します。ただし、顧客のサーバーにデプロイすると、グリッドのページングが壊れます。最初のページは正しいですが、次のページは正しい行を返しません。私は例で何が起こるかを説明することしかできません:

ページ1に結果1〜10、ページ2の結果11〜20などを表示するとします。

何が起こるかは次のようなものです:ページ1は1-10を示し、ページ2は1,2,3,4、6、8、9,28,29,30を示しますページ3は1,2,3,28,29,36を示します、37、..

そのため、行がめちゃくちゃになり、多くの結果が表示されることはありません(前のページの結果に置き換えられます)。また、行が数だけずれているわけではないことにも注意してください。

何時間も検索とデバッグを行った後、使用されているSqlDataAdapterのFill()メソッドが間違った結果を返すと結論付けることしかできません。アダプタは、SQLクエリをプレーンテキストとして使用するSqlCommandを使用します。このクエリはSQLServerManagement Studioで実行でき、正しい結果が返されるため、.NETFramework自体の内部で実際に問題が発生する必要があります。

.NETソースデバッグを有効にしてFillメソッドにステップインしようとしましたが、それを機能させることができないため、基本的にオプションがなくなりました。

ヒント/提案は大歓迎です!

<問題は解決しました。以下の回答を参照してください>

4

1 に答える 1

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 句を追加したところ、問題は解決しました。まだ 1 つの質問が残っています: これはバグですか、それとも機能ですか?

于 2012-09-26T08:39:43.077 に答える