この URL から取得したコードを参照したい
https://msdn.microsoft.com/en-us/library/ms171624%28v=vs.110%29.aspx
上記の URLdatagridview
は、オンデマンドでデータをロードする方法を示しており、ユーザーがスクロールして制限に達すると、データが db からロードされることを意味します。私のコードは機能していますが、SQL Server から非常に大きなストアド プロシージャを使用しなければならない状況にあり、非常に多くの計算の後にデータを返します。そのため、インライン SQL ではなくストアド プロシージャを使用する必要があるため、コードをカスタマイズする必要があります。上記のリンクから、誰でも完全に機能するサンプル コードを確認できます。ここでは、db からデータをフェッチするためにインライン SQL が起動された場所から 3 つのルーチンを強調表示します。このルーチンは、変更する必要があり、インライン SQL の代わりにそこからストアド プロシージャを呼び出したいと考えています。
この 1 つのルートから、インライン SQL を使用します。
public int RowCount
{
get
{
// Return the existing value if it has already been determined.
if (rowCountValue != -1)
{
return rowCountValue;
}
if (filters.Trim().ToUpper().IndexOf("WHERE") > -1)
{
filters = filters.ToUpper().Replace("WHERE", string.Empty);
}
// Retrieve the row count from the database.
command.CommandText = "SELECT COUNT(*) FROM " + tableName + " WHERE 1=1 " + (filters.Trim().Length > 0 ? " AND " : string.Empty) + filters;
rowCountValue = (int)command.ExecuteScalar();
return rowCountValue;
}
}
このルーチンもインライン SQL を使用します。
public DataColumnCollection Columns
{
get
{
// Return the existing value if it has already been determined.
if (columnsValue != null)
{
return columnsValue;
}
// Retrieve the column information from the database.
command.CommandText = "SELECT * FROM " + tableName;
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.FillSchema(table, SchemaType.Source);
columnsValue = table.Columns;
return columnsValue;
}
}
このルーティーンも
public DataTable SupplyPageOfData(int lowerPageBoundary, int rowsPerPage)
{
// Store the name of the ID column. This column must contain unique
// values so the SQL below will work properly.
if (columnToSortBy == null)
{
columnToSortBy = this.Columns[0].ColumnName;
}
if (!this.Columns[columnToSortBy].Unique)
{
throw new InvalidOperationException(String.Format(
"Column {0} must contain unique values.", columnToSortBy));
}
// Retrieve the specified number of rows from the database, starting
// with the row specified by the lowerPageBoundary parameter.
if (filters.Trim().ToUpper().IndexOf("WHERE") > -1)
{
filters = filters.ToUpper().Replace("WHERE", string.Empty);
}
command.CommandText = "Select Top " + rowsPerPage + " " +
CommaSeparatedListOfColumnNames + " From " + tableName +
" WHERE 1=1 AND " + filters + " " + (filters.Trim().Length > 0 ? " AND " : string.Empty) + columnToSortBy + " NOT IN (SELECT TOP " +
lowerPageBoundary + " " + columnToSortBy + " From " +
tableName + " WHERE 1=1 " + (filters.Trim().Length > 0 ? " AND " : string.Empty) + filters + " Order By " + sortColumn +
") Order By " + sortColumn;
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);
return table;
}
ここで、他の 2 つのルーチンを置き換える 1 つのルーチンでストアド プロシージャを使用したいと考えています。
最初の結果が行数を返しず、2 番目の結果が実際のデータを返すストアド プロシージャを開発します。
このようにして、ストアド プロシージャでページングしています。
WHERE [rn] BETWEEN ((@StartIndex-1) * @EndIndex ) + 1 AND (@StartIndex * @EndIndex)
上記のルーチンがSupplyPageOfData
どのようにページングを行っているかを見て、使用方法を教えてくださいlowerPageBoundary
。rowsPerPage
その結果、sp でこれら 2 つの値を送信でき、sp はページングを正常に実行できます。
rowsPerPage
は16に固定されていますが、16でジャンプ しlowerPageBoundary
ます。そのため、コードを変更する方法のように計算が頭に浮かびません。lowerPageBoundary
rowsPerPage
WHERE [rn] BETWEEN ((@StartIndex-1) * @EndIndex ) + 1 AND (@StartIndex * @EndIndex)
コードとサンプルで私を助けてください。ありがとう