ストアド プロシージャを組み合わせると、ページングが最も簡単になります。次のソース コードを参照してください。
このページング クラスによって操作されるストアド プロシージャ #region このページング クラスによって操作されるストアド プロシージャ。
/**//******************************************** *** ************
*
* 以下のストアド プロシージャと組み合わせた強力な機能
*
************************************************* * *****/
/**//*
-- ページャー 1,10,0,0, 'EmployeeID>2 and EmployeeID<5 ' , 'Employees','*','LastName',0
プロシージャの作成ページャー
@PageIndex int, -- ページ 1 のインデックス
@PageSize int, -- ページごとのページ数 2
@RecordCount int out,--行の総数 3
@PageCount int out, -- 総ページ数 4
@WhereCondition Nvarchar(1000),--クエリ条件 5
@TableName nvarchar(500),--クエリテーブル名 6
@SelectStr nvarchar(500) = '*',--クエリ列 7
@Order nvarchar(500), -- ソートされた列 8
@OrderType ビット = 0, -- ソート タイプを設定します。0 以外の値は降順 9 です。
@Groupby NVarChar(100) = ''
AS
宣言 @strSQL nvarchar(2000) -- メイン ステートメント
@strTmp nvarchar(1000) を宣言 -- 一時変数
@strOrder nvarchar(1000) を宣言 --
@OrderType != 0 の場合の
並べ替えタイプ
始める
set @strTmp = '<(最小値を選択'
set @strOrder = ' order by ' + @Order +' desc'
終わり
それ以外
始める
set @strTmp = '>(最大値を選択'
set @strOrder = ' order by ' + @Order +' asc'
end
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @SelectStr + ' from '
+ @TableName + ' where ' + @Order + '' + @strTmp + '(['
+ @Order + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @Order + '] from ' + @TableName + '' + @strOrder + ') as tblTmp)'
+ @Groupby + @strOrder
if @WhereCondition != ''
set @strSQL = '先頭を選択 ' + str(@PageSize) + ' ' + @SelectStr + ' from '
+ @TableName + ' where ' + @Order + '' + @strTmp + '(['
+ @Order + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @Order + '] from ' + @TableName + ' where (' + @WhereCondition + ') '
+ @strOrder + ') as tblTmp) および (' + @WhereCondition + ') ' + @Groupby + @strOrder
if @PageIndex = 1
始める
@strTmp を設定 = ''
if @WhereCondition != ''
set @strTmp = ' where (' + @WhereCondition + ')'
set @strSQL = '先頭を選択 ' + str(@PageSize) + ' ' + @SelectStr + ' from '
+ @TableName + '' + @strTmp + ' ' + @Groupby + @strOrder
終わり
実行(@strSQL)
--print @strSQL
IF @WhereCondition <>''
始める
SET @strTmp = 'SELECT -1 FROM ' + @TableName + ' Where ' + (@WhereCondition)
終わり
それ以外
始める
SET @strTmp = 'SELECT -1 FROM ' + @TableName
終わり
EXEC SP_EXECUTESQL @strTmp
SET @RecordCount = @@RowCount
-- 総ページ数を取得します。
-- 「CEILING」関数: 一定の数値以上の最小の整数を取得します
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
行く
************************************************* * ***************************/
/**//******************************************** *******************************
*
* 使用法
*
************************************************* * *****************************/
/**//*
Dim ts As String = Request.Form.Item("txtDate")
If (ts = "" Or ts Is Nothing) then
ts = Request.QueryString("txtDate")
終了の場合
Dim ts2 As String = Request.Form.Item("txtDate2")
If (ts2 = "" または ts2 が何もない) then
ts2 = Request.QueryString("txtDate2")
End If
Dim ps As String = Request.Form.Item("pageIndex")
If (ps = "" Or ps Is Nothing) then
ps = Request.QueryString("pageIndex")
整数 = 2 の
場合に終了
整数としてのディム p = 1
もし ts が何もないなら
ts = ""
終了の場合
ps が何もないなら
ps = ""
End If
Not (ps = "") then
p = 整数.解析(ps)
End If
Dim pager As Pager = New Pager
pager.PageIndex = p
pager.PageSize = 20
pager.PageMode = PageMode.Str
pager.WhereCondition = "convert(datetime,'" + ts + "') と Convert(datetime,'" + ts2 + "') の間の日付"
'pager.WhereCondition = "convert(char(10),TheDate,120)= '" + ts + "'"
pager.TableName = "LoadCountlog"
pager.SelectStr = "*"
pager.Order = "ID"
pager.OrderType = False
Dim dt As System.Data.DataTable = pager.GetDatas(p)
myDataGrid.DataSource = dt
myDataGrid.DataBind()
Dim goUrl As String = "WebForm1.aspx?txtDate=" + ts + "&txtDate2=" + ts2
Me.Label3.Text = "合計:" + pager.PageCount.ToString + "Page," + pager.RecordCount.ToString() + "バー<strong>" + pager.OutPager(pager, goUrl, False) + "< /strong>」
*/
#エンドリージョン
システムを使用する;
System.Data を使用します。
System.Data.SqlClient を使用します。
System.Configuration を使用します。
System.Collections を使用します。
System.Text を使用します。
名前空間 solucky
{
/**//// <概要>
/// ページングモード
/// </概要>
パブリック列挙型 PageMode
{
/**//// <概要>
///番号ページング
/// </概要>
数値 =0、
/**//// <概要>
/// 文字のページング
/// </概要>
強度 =1
}
/**//// <概要>
/// ページング クラスはストアド プロシージャを通じてページングを実行でき、非常に強力です。
/// </概要>
パブリッククラスのページャー
{
プライベート int pageIndex = 0;
プライベート int レコードカウント = 0;
private int pageSize = 20;
private int pageCount = 0;
プライベート int rowCount = 0;
プライベート文字列テーブル名 = "";
プライベート文字列 whereCondition = "1=1";
プライベート文字列 selectStr = "*";
プライベート文字列の順序 = "";
プライベート文字列プロシージャ = "ページャー";
private bool orderType = true;
プライベート PageMode pageMode =PageMode.Num;
プライベート文字列 sqlConnectionString = ConfigurationSettings.AppSettings["データベース"];
プライベート文字列データベース所有者 = "dbo";
データ接続#リージョン データ接続
/**//// <概要>
/// データ接続文字列
/// </概要>
プライベート文字列SqlConnectionString
{
得る
{
this.sqlConnectionString を返します。
}
セット
{
this.sqlConnectionString=値;
}
}
/**//// <概要>
///接続インスタンスを取得する
/// </概要>
/// <戻り値></戻り値>
プライベート SqlConnection GetSqlConnectionString()
{
試す
{
新しい SqlConnection(SqlConnectionString) を返します。
}
キャッチ
{
throw new Exception("SQL 接続文字列が無効です。");
}
}
/**//// <概要>
/// データオブジェクトの所有者
/// </概要>
プライベート文字列データベース所有者
{
得る
{
this.databaseOwner を返します。
}
セット{
this.databaseOwner=値;
}
#endregion
public Pager(
)
{
//
// TODO: ここにコンストラクター ロジックを追加します
//
//Enum.Parse(tyo
}
public Pager(string connstr)
{
if (connstr!=null)
this.SqlConnectionString=connstr;
}
#地域
/**//// <概要>
/// 操作対象のストアド プロシージャの名前には、デフォルトのページング ストアド プロシージャが設定されています。
/// </概要>
パブリック文字列の手順
{
得る{
this.procedure を返します。
}
セット {
if (value==null || value.Length <=0)
{
this.procedure="ページャー";
}
それ以外
{
this.procedure=値;
}
}
}
/**//// <概要>
/// 現在表示しているページ数
/// </概要>
public int PageIndex
{
得る
{
this.pageIndex を返します。
}
セット
{
this.pageIndex = 値;
}
}
/**//// <概要>
///総ページ数
/// </概要>
public int PageCount
{
得る
{
this.pageCount を返します。
}
セット
{
this.pageCount = 値;
}
}
/**//// <概要>
///総行数
/// </概要>
public int RecordCount
{
得る
{
this.recordCount を返します。
}
セット
{
this.recordCount = 値;
}
}
/**//// <概要>
///ページごとの項目数
/// </概要>
public int PageSize
{
得る
{
this.pageSize を返します。
}
セット
{
this.pageSize = 値;
}
}
/**//// <概要>
///テーブル名
/// </概要>
パブリック文字列テーブル名
{
得る
{
テーブル名を返します。
}
セット
{
this.tableName = 値;
}
}
/**//// <概要>
/// 条件付きクエリ
/// </概要>
パブリック文字列 WhereCondition
{
得る
{
whereCondition を返します。
}
セット
{
whereCondition = 値;
}
}
/**//// <概要>
/// クエリ対象(検索対象)、例:AddTime AS 時間、ID AS 番号
/// </概要>
パブリック文字列 SelectStr
{
得る
{
selectStr を返します。
}
セット
{
selectStr = 値;
}
}
/**//// <概要>
/// ソートされた列
/// </概要>
パブリック文字列の順序
{
得る
{
返品命令。
}
セット
{
順序 = 値;
}
}
/**//// <概要>
/// ソートタイプ true:asc false:desc
/// </概要>
public bool OrderType
{
得る
{
orderType を返します。
}
セット
{
orderType = 値;
}
}
/**//// <概要>
/// ページングモード
/// </概要>
パブリック PageMode ページモード
{
得る
{
this.pageMode を返します。
}
セット
{
this.pageMode = 値;
}
}
/**//// <概要>
/// 現在返品されている数量を取得します
/// </概要>
パブリック int 行数
{
得る
{
this.rowCount を返します。
}
プライベート
文字列 groupby;
パブリック文字列Groupby
{
得る
{
this.groupby を返します。
}
セット
{
this.groupby = 値;
}
#エンド
リージョン
/**//// <概要>
/// ページネーションの検索結果
/// </概要>
public DataTable GetDatas(int pageIndex)
{
this.pageIndex = ページインデックス;
ポケベル ポケベル = これ;
//pager.pageIndex = pageIndex;
DataTable returnTb = Pagination(ref pager).Tables[0];
this.rowCount = returnTb.Rows.Count;
リターンリターンTb;
}
/**//// <概要>
/// ページング操作ストアド プロシージャ関数
/// </概要>
/// <param name="pager"></param>
/// <戻り値></戻り値>
プライベート DataSet ページネーション (Pager ページャーを参照)
{
using (SqlConnection myConnection = GetSqlConnectionString() )
{
SqlDataAdapter myCommand = new SqlDataAdapter(pager.databaseOwner + "."+pager.Procedure, myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameterparameterPageIndex = new SqlParameter("@PageIndex", SqlDbType.Int);
パラメータページインデックス.値 = ページャー.ページインデックス;
myCommand.SelectCommand.Parameters.Add(parameterPageIndex);
SqlParameterparameterPageSize = new SqlParameter("@PageSize", SqlDbType.Int);
パラメータページサイズ.値 = ページャー.ページサイズ;
myCommand.SelectCommand.Parameters.Add(parameterPageSize);
SqlParameterparameterRecordCount = new SqlParameter("@RecordCount", SqlDbType.Int);
パラメータレコードカウント.値 = 0;
パラメータレコードカウント.方向 = パラメータ方向.入力出力;
myCommand.SelectCommand.Parameters.Add(parameterRecordCount);
SqlParameterparameterPageCount = new SqlParameter("@PageCount", SqlDbType.Int);
パラメータページカウント.値 = 0;
パラメータページカウント.方向 = パラメータ方向.入力出力;
myCommand.SelectCommand.Parameters.Add(parameterPageCount);
SqlParameterparameterWhereCondition = new SqlParameter("@WhereCondition", SqlDbType.NVarChar,500);
パラメータWhereCondition.Value = pager.WhereCondition;
myCommand.SelectCommand.Parameters.Add(parameterWhereCondition);
SqlParameterparameterTableName = new SqlParameter("@TableName", SqlDbType.NVarChar,500);
パラメータテーブル名.値 = ページャー.テーブル名;
myCommand.SelectCommand.Parameters.Add(parameterTableName);
SqlParameterparameterOrder = new SqlParameter("@Order", SqlDbType.NVarChar,500);
パラメータオーダー.値 = ページャー.オーダー;
myCommand.SelectCommand.Parameters.Add(parameterOrder);
SqlParameterparameterSelectStr = new SqlParameter("@SelectStr", SqlDbType.NVarChar,500);
パラメータ選択Str.Value = pager.SelectStr;
myCommand.SelectCommand.Parameters.Add(parameterSelectStr);
SqlParameterparameterGroupby = new SqlParameter("@Groupby", SqlDbType.NVarChar, 100);
パラメータGroupby.Value = pager.Groupby;
myCommand.SelectCommand.Parameters.Add(parameterGroupby);
SqlParameterparameterOrderType = new SqlParameter("@OrderType", SqlDbType.Bit);
パラメータOrderType.Value = pager.OrderType==false?0:1;
myCommand.SelectCommand.Parameters.Add(parameterOrderType);
DataSet returnDS = new DataSet();
//SqlDataAdapter sqlDA = myCommand.crnew SqlDataAdapter(myCommand);
myCommand.Fill(returnDS);
pager.PageCount = (int)parameterPageCount.Value;
pager.RecordCount = (int)parameterRecordCount.Value;
return returnDS;
}
}
ページネーションの生成 #region ページネーションの生成
/**//// <概要>
/// ページング形式を生成する
/// </概要>
/// <param name="pager"></param>
/// <param name="url"></param>
/// <param name="isBr"></param>
/// <戻り値></戻り値>
パブリック文字列 OutPager(ページャー ページャー,文字列 URL,ブール isBr)
{
StringBuilder returnOurWml;
if(isBr)
{
returnOurWml= new StringBuilder("["+ pager.PageCount.ToString() + "page," + pager.RecordCount.ToString() +"bar]<br/>");
}
それ以外
{
returnOurWml = 新しい StringBuilder();
}
if (pager.PageMode == PageMode.Num)
{
// ページングの各行に表示される番号
int ページ数 = 10;
int ページ = 0;
int startInt = 1;
int endInt = pager.PageCount;
int i = 1;
文字列 endStr = "";
if (pager.PageCount>pagersCount)
{
//ダブル k = ;
ページャー = pager.PageIndex / pagersCount;
if (ポケベル == 0)
{
ポケベル = 1;
}
else if((pager.PageIndex % pagersCount)!=0)
{
ポケベル +=1;
endInt
= ページャー * ページャー数;
if (pager.PageIndex <= endInt)
{
startInt = endInt +1 - pagersCount;
if (startInt <1)
{
startInt = 1;
}
}
//表示数量不足時のpagersCount
if (endInt>=pager.PageCount)
{
endInt = pager.PageCount;
}
それ以外
{
//if (pager.PageIndex)
endStr = " <a href="";
endStr += url + "&pageIndex=" + (endInt + 1).ToString() + "" title='page" + (endInt + 1).ToString()+"page'>";
endStr += ">>";
endStr += "</a> ";
if
(ポケベル > 1)
{
returnOurWml.Append(" <a href="");
returnOurWml.Append(url + "&pageIndex=" + (startInt - 1).ToString() + "" title='page" + (startInt - 1).ToString()+"page'>");
returnOurWml.Append("<<");
returnOurWml.Append("</a> ");
}
}
for (i = startInt; i<=endInt;i++)
{
if (i!=pager.PageIndex)
{
returnOurWml.Append(" <a href="");
returnOurWml.Append(url + "&pageIndex=" + i.ToString() + "" title='page"+ i.ToString()+"page'>");
returnOurWml.Append("["+i.ToString() + "]");
returnOurWml.Append("</a> ");
}
それ以外
{
returnOurWml.Append("<u>"+ i.ToString() + "</u>");
}
}
returnOurWml.Append(endStr);
return returnOurWml.Append("<br/>").ToString();
}
それ以外
{
if (pager.PageIndex > 1)
{
returnOurWml.Append(" <a href="");
returnOurWml.Append(url + "&pageIndex=" + (pager.PageIndex -1).ToString() + "">");
returnOurWml.Append("前のページ");
returnOurWml.Append("</a> ");
}
if (pager.PageIndex < pager.PageCount)
{
returnOurWml.Append(pager.PageIndex.ToString());
returnOurWml.Append(" <a href="");
returnOurWml.Append(url + "&pageIndex=" + (pager.PageIndex +1).ToString() + "">");
returnOurWml.Append("次のページ");
returnOurWml.Append("</a> ");
}
return returnOurWml.Append("<br/>").ToString();
}
#エンド
リージョン
}
}
http://www.cnblogs.com/solucky/archive/2006/09/20/509741.html