2009-08-05 3 views
0

페이징을 사용하여 ObjectDataSource에 연결된 GridView가 있습니다. 조회 결과 페이지가 표시되는 순서에 따라 정렬 순서가 달라지는 것을 제외하고는 페이징이 잘 작동합니다. 이로 인해 항목이 다른 문제 중 후속 페이지에 다시 나타납니다. 문제를 한 번에 한 페이지 씩 읽은 DAL로 추적했습니다. 결과 세트 크기가 변경되면 분명히 정렬이 변경 될 것입니다. 이 알고리즘이 향상 되었습니까? 가능한 경우 datareader를 사용하고 싶습니다.문제점 : 페이지에 따라 GridView/ObjectDataSource 정렬 변경

[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)] 
    public static WordsCollection LoadForCriteria(string sqlCriteria, int maximumRows, int startRowIndex, string sortExpression) 
    { 
     //DEFAULT SORT EXPRESSION 
     if (string.IsNullOrEmpty(sortExpression)) sortExpression = "OrderBy"; 
     //CREATE THE DYNAMIC SQL TO LOAD OBJECT 
     StringBuilder selectQuery = new StringBuilder(); 
     selectQuery.Append("SELECT"); 
     if (maximumRows > 0) selectQuery.Append(" TOP " + (startRowIndex + maximumRows).ToString()); 
     selectQuery.Append(" " + Words.GetColumnNames(string.Empty)); 
     selectQuery.Append(" FROM sw_Words"); 
     string whereClause = string.IsNullOrEmpty(sqlCriteria) ? string.Empty : " WHERE " + sqlCriteria; 
     selectQuery.Append(whereClause); 
     selectQuery.Append(" ORDER BY " + sortExpression); 
     Database database = Token.Instance.Database; 
     DbCommand selectCommand = database.GetSqlStringCommand(selectQuery.ToString()); 
     //EXECUTE THE COMMAND 
     WordsCollection results = new WordsCollection(); 
     int thisIndex = 0; 
     int rowCount = 0; 
     using (IDataReader dr = database.ExecuteReader(selectCommand)) 
     { 
      while (dr.Read() && ((maximumRows < 1) || (rowCount < maximumRows))) 
      { 
       if (thisIndex >= startRowIndex) 
       { 
        Words varWords = new Words(); 
        Words.LoadDataReader(varWords, dr); 
        results.Add(varWords); 
        rowCount++; 
       } 
       thisIndex++; 
      } 
      dr.Close(); 
     } 
     return results; 
    } 

답변

0

MSDN에서이 문제에 대한 해결책을 발견했습니다. 트릭은 전체 쿼리를 수행하고 정렬이 항상 일관된 방식으로 흥미로운 하위 집합 만 반환하는 것입니다. 그러나이 절차는 SQL 2005에서만 작동합니다.

[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)] 
    public static WordsCollection LoadForCriteria(string sqlCriteria, int maximumRows, int startRowIndex, string sortExpression) 
    { 
     //DEFAULT SORT EXPRESSION 
     if (string.IsNullOrEmpty(sortExpression)) sortExpression = "OrderBy"; 
     //CREATE THE DYNAMIC SQL TO LOAD OBJECT 
     StringBuilder selectQuery = new StringBuilder(); 
     selectQuery.Append("SELECT "); 
     selectQuery.Append(Words.GetColumnNames(string.Empty)); 
     selectQuery.Append(" FROM ("); 
     selectQuery.Append("SELECT "); 
     selectQuery.Append(Words.GetColumnNames(string.Empty)); 
     selectQuery.Append(", ROW_NUMBER() OVER (ORDER BY " + sortExpression + ") AS RowRank"); 
     selectQuery.Append(" FROM sw_Words) AS WordsWithRowNumbers"); 
     selectQuery.Append(" WHERE RowRank >" + startRowIndex.ToString() + " AND " + "RowRank <=" + (startRowIndex + maximumRows).ToString()); 
     string whereClause = string.IsNullOrEmpty(sqlCriteria) ? string.Empty : " AND " + sqlCriteria; 
     selectQuery.Append(whereClause); 
     Database database = Token.Instance.Database; 
     DbCommand selectCommand = database.GetSqlStringCommand(selectQuery.ToString()); 
     //EXECUTE THE COMMAND 
     WordsCollection results = new WordsCollection(); 
     int rowCount = 0; 
     using (IDataReader dr = database.ExecuteReader(selectCommand)) 
     { 
      while (dr.Read()) 
      { 
       Words varWords = new Words(); 
       Words.LoadDataReader(varWords, dr); 
       results.Add(varWords); 
       rowCount++; 
      } 
      dr.Close(); 
     } 
     return results; 
    } 
관련 문제