4

javascriptと次のSQLステートメント(SQL Server 2008)を使用して、.NETWebサイトで無限スクロールを実行しようとしています。このSQLは最初の10行を取得しますが、私のjavascriptにより、ユーザーがページの一番下までスクロールするたびにSQLが実行され、毎回同じ(最初の10)レコードがプルされますが、次の行をプルする必要がありますユーザーが一番下までスクロールするたびに、10レコード。ユーザーがページの一番下までスクロールするたびに、このsqlとrow_numberを使用して次の10行を取得するにはどうすればよいですか?

SELECT * FROM 
  (SELECT ROW_NUMBER() OVER (ORDER BY DateTime) As RowNum, 
  * From Topic) As a 
WHERE RowNum 
BETWEEN 1 AND 10

これがjavascriptです:

<script type="text/javascript">
        $(document).ready(function () {

       function lastPostFunc() {
           $('#divPostsLoader').html('<img src="images/bigLoader.gif">');

           //send a query to server side to present new content
           $.ajax({
               type: "POST",
               url: "Default.aspx/Foo",
               data: "{}",
               contentType: "application/json; charset=utf-8",
               dataType: "json",
               success: function (data) {

                   if (data != "") {
                       $('.divLoadData:last').after(data.d);
                   }
                   $('#divPostsLoader').empty();
               }

           })
       };

       //When scroll down, the scroller is at the bottom with the function below and fire the lastPostFunc function
       $(window).scroll(function () {
           if ($(window).scrollTop() == $(document).height() - $(window).height()) {
               lastPostFunc();
           }
       });

    });
</script>

これで、ストアドプロシージャに上記のSQLが含まれています。

<System.Web.Services.WebMethod()>
Public Shared Function Foo() As String
    Dim strConn As String = "Data Source="
    Dim conn As New SqlConnection(strConn)
    Dim Cmd As New SqlCommand("InfiniteScroll", conn)
    Cmd.CommandType = CommandType.StoredProcedure
    Dim DA As New SqlDataAdapter(Cmd)
    Dim DS As New DataSet()
    DA.Fill(DS, "RefologyForumTopic")
    Dim getPostsText As New StringBuilder()
    Dim dv As DataView = DS.Tables(0).DefaultView

    For Each myDataRow As DataRowView In dv
        getPostsText.AppendFormat("price: {0}</br>", myDataRow("Topic"))
        getPostsText.AppendFormat("description: {0}</br></p>", myDataRow("UserID"))
    Next

    getPostsText.AppendFormat("<div style='height:15px;'></div>")
    Return getPostsText.ToString()
End Function
4

2 に答える 2

3

通常、これは、ページや結果カウンターのパラメーターを渡すストアドプロシージャを使用して行います。このようなもの:

SELECT * 
FROM (
   SELECT ROW_NUMBER() OVER (ORDER BY DateTime) As RowNum, * 
   FROM Topic) As a 
WHERE RowNum BETWEEN 1+(@recsPerPage)*(@page-1) AND @recsPerPage*(@page)

これがSQLフィドルです。

- 編集

これはすべてテストされていませんが、正しい方向に進むはずです。

まず、非表示のページをページに追加して、現在のページ番号を保存します。

<input type=hidden id=hidPage name=hidPage value="1">

次に、ajax呼び出しでデータパラメーターを更新します。

data: { Page: $("#hidPage").value() },

第三に、パラメータを受け入れるようにWebメソッドを更新します。

Public Shared Function Foo(page as string (or int -- would need to test for sure)) As String

次に、SQLを更新してパラメーターを渡します。これを書き直すつもりはありませんが、次のリンクを参考にしてください:http: //msdn.microsoft.com/en-us/library/bbw6zyha (v=vs.71).aspx

そして最後に、ajaxサクセスハンドラーでhidPage変数をリセットします。

var newPage = parseInt($("#hidPage").val());
$("#hidPage").val(newPage+1);

幸運を。

于 2013-01-24T18:12:30.003 に答える
1

以前に選択した行を除外する必要があります。これを行うには、以前に選択したレコードを挿入する履歴テーブルを作成する必要があります。

したがって、topicテーブルの列に主キーがあり、列を呼び出し、topic_id履歴テーブルがhist_topic列の主キーで呼び出される場合、テーブルにないtopic_id最初の10レコードをクエリする必要があります。topichist_topic

topic_idデータを読み取った後、選択した値をに挿入するだけhist_topicです。これは、バルクインサートを使用してすばやく実行できます。

最初のクエリの前に、誤検知が発生しないように、前の結果のテーブルを空にする必要があります。

session複数のユーザーを処理するには、ページの読み込みごとに生成される一意の番号を含む追加のフィールド、numericを使用して履歴テーブルを拡張する必要があります。AJAXを使用しているので、この一意のIDをあるページから別のページに渡すことを心配する必要はありません。一意のIDは、ページの読み込み時に追加のスクリプトを呼び出すことで生成できます。

これは、クエリ中に新しいレコードが追加された場合にも役立ちます。

手順は次のようになります。ページの読み込み-一意のIDクエリを生成します

SELECT * FROM 
  (SELECT ROW_NUMBER() OVER (ORDER BY DateTime) As RowNum, 
  * From Topic) As a 
WHERE RowNum BETWEEN 1 AND 10
AND NOT EXISTS (SELECT 1 FROM HIST_TOPIC B WHERE A.TOPIC_ID = B.TOPIC_ID AND B.SESSION = @SESSION);

履歴に挿入-一括挿入を使用

onunload挿入された値のクリーンアップは、のイベントで実行できますbody

最も重要な利点の1つは、このアプローチを使用してレコードを失うことがないことです。ページをクライアントレベルで保持するアプローチを考えてみましょう。次のレコードがあると想像してください。

id   |   some_number   |  some_text
------------------------------------
1    |   1             |    text1
2    |   4             |    text4
3    |   9             |    text9
4    |   10            |    text10
5    |   19            |    text19

そして、最初の5つのレコードを要求し、some_numberに昇順のorderby句があるとします。

select * from topic where RowNum BETWEEN (@recsPerPage+1)*(@page-1) AND @recsPerPage*(@page) order by some_number

@recsPerPage = 5

次に、システムは新しいレコードを取得します

6 11 text11

次のクエリでは、新しいレコードが新しい番号5になるため、クエリによって、最初のページに表示されたレコードが再び表示されます。

5 19 text19

LE:私はJavaで作業しているため、.NET Webアプリケーションの経験がありません。したがって、私の世界での例しか挙げられず、おそらく翻訳することができます。

バルクインサート

バルクインサートに関しては、バルクインサートのこのリンクを見つけまし

ページの読み込み時に一意のIDを生成する

.NET Webアプリケーションで行う方法はわかりませんが、JSPを使用してJavaWebアプリケーションで行う方法についてのヒントを示します。JSPでは、(サーブレットに配置された)Javaコードが最初に実行され、次にhtmlが生成されます。したがって、最初にサーブレットを追加すると、ページがロードされたときに実行されます。

<% long uniqueId = UniqueIdGeneration.getUniqueId();%>

uniqueIdlongスクリプトレット内にいるときはいつでも、ページ全体で使用できる変数です。このgetUniqueIdメソッドは、時間をミリ秒単位で返します。一意の数値のみが生成されるようにするには、結果を返す前に1ミリ秒スリープさせる必要があります。

ページをアンロード

onunloadのイベントを使用しbodyます。

<javascript>
function doUnload() {
  var session=<%=uniqueId%>;
  //use the new session variable to pass it to the server using AJAX. The server will respond by deleting the records corresponding to it.
}
</javascript>
于 2013-01-24T18:14:15.757 に答える