1

Asp.net では、次のコードを使用してページネーションを実現しようとしています。

String query="SELECT * "+
             "FROM (SELECT Distinct emp_name, emp_address, "+
             "         ROW_NUMBER() OVER(ORDER BY emp_id) AS rownum"+
             "       FROM Employee"+
             "     )as Person "+
             "WHERE rownum>"+ start +" and rownum <="+ end +";

SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();

SqlDataReader reader = cmd.ExecuteReader();

上記のコードは行を取得しませんDistinct。single のエントリの総数とともにemp_nameemp_idを取得
するように my を調整するにはどうすればよいですか? querydistinct order by ExecuteReader()

ExecuteReader()現在、最初にデータを取得し、次に合計数を取得するために 2 回 呼び出しています。

ROW_NUMBER() が区別されない SQL Server DISTINCT ページネーションに従いましたが、コードに実装する方法を理解できませんでした。助けてください。

4

2 に答える 2

1

Row_Number() はあなたの Distinct を殺します。サブクエリの内側に Distinct を配置し、(外側の) 結果セットの上に行番号を配置します (個別のセットを作成した後)。

String query="SELECT *, ROW_NUMBER()  OVER(ORDER BY emp_id) AS rownum "+
          "FROM (SELECT Distinct emp_name, emp_address, emp_id "+
          "       FROM Employee"+
          "     )as Person "+
          "WHERE rownum>"+ start +" and rownum <="+ end +"; 
于 2012-10-19T13:35:49.037 に答える
0

連結を避けるためString.Formatに生の文字列 ( ) を使用します。@

String query = String.Format(@"
    select emp_name, emp_address, rownum 
    from (
        select
            emp_name, emp_address,
            row_number() over(order by emp_id) as rownum
        from (
            select distinct emp_name, emp_address
            from employee
        ) s
    ) as Person 
    where rownum > {0} and rownum <= {1}
    ;
    select count(*) as total
    from (
        select distinct emp_name, emp_address
        from employee
        where rownum > {0} and rownum <= {1}
    ) s
    ;    
", start, end);

SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();

SqlDataReader reader = cmd.ExecuteReader();

// gets the first data set
while (reader.Read())
{
    ...
}

// gets the second
reader.NextResult();
reader.Read();
int total = (int)reader["total"];

NextResult複数の結果セットを読み取るために使用します。

于 2012-10-19T13:38:57.383 に答える