row_number over(order by id desc)语句进行存储过程高效分页,百度分页(1,2,3,4,5....)

来源:互联网 发布:17年淘宝虚拟店开不了 编辑:程序博客网 时间:2024/06/05 10:27

模仿百度分页示意效果图:

sql procdure code:

create   proc [dbo].[MyPages](
 @tableName varchar(155),
 @pageIndex int,
 @pageSize int,
 @pageCurrent int output,
 @pageNumber int output,  --总页数
 @pageCount int output, --总记录
 @clickType varchar(15)=null,--点击按钮的类型
 @keyId varchar(15),
 @columnName varchar(255),
 @strWhere varchar(1000)
)
as
declare @totalCount int
declare @strCount nvarchar(155)
declare @strSql  nvarchar(1000)

set nocount on
set @strCount='SELECT @totalCount=COUNT(*) FROM '+ @tableName+' WHERE '+@strWhere
exec sp_executeSql @strCount,N'@totalCount int out',@totalCount=@pageCount out
 if(@pageCount%@pageSize=0)
  set @pageNumber=(@pageCount/@pageSize)
 else
  begin
  set @pageNumber=(@pageCount/@pageSize)+1
  end
--if(@strWhere='')begin set @strWhere='1=1' end
if(@clickType!='')begin
  if(@clickType='pre')begin
    set @pageIndex=(@pageIndex-1)
  end
  else if(@clickType='next')begin
    set @pageIndex=(@pageIndex+1)
  end
end
set @pageCurrent=@pageIndex
set @strSql='SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@keyId+' DESC) AS Row,'+@columnName+' FROM '+@tableName+' WHERE '+ @strWhere+' ) TT WHERE TT.Row BETWEEN '+str((@pageIndex-1)*@pageSize+1)+' AND '+str(@pageIndex*@pageSize)
exec (@strSql)
set nocount off

 

 

在设计这段存储过程的时候,让我深刻了解了两个知识点:

一:在声明变量的时候,一定要注意变量的类型

下面讲下声明变量类型时的错误:

   1.sql存储过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'错误时,就要注意在declare xx声明变量的时候,它的类型(nvarchar(size))一定要定义正确。

   比如:

create procedure testProce(
  @tableName varchar(25),
  @count int output
)AS
declare @strSql varchar(255) -----改为declare @sttSql Nvarchar(255)就对了
declare @totalCount int

set @strSql='SELECT @totalCount=COUNT(*) FROM '+@tableName
execute (@strSql)

set @count=@totalCount

 

//调用存储过程

declare @count int
execute testProce N'BG_Bargain',@count out

消息 214,级别 16,状态 2,过程 sp_executesql,第 1 行
过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'。

一定要切记:declare @strSql  Nvarchar(255) 要加一个N

 

二:execute命令和execute sp_executeSql的区别

2.在很久以前对于存储过程一直比较的陌生,今天要用到动态拼接sql语句,并且要输入、输出参数,远远用execute是很难做到的,这让我了解到sp_executeSql的用法

  简单的讲下execute @sql 和execute sp_executeSq @Sqll的区别:

execute描述: 

   a.execute不提供接口这里的接口是指,它不能执行一个包含一个带变量符的批处理,如果执行带变量符的批处理,就会出现    必须声明标量变量 "@变量"等错误信息。

   b.execute除了不支持动态批处理中的输入参数外,他也不支持输出参数
execute sp_executeSql描述:
  

sp_executesql提供接口

sp_executesql命令比execute命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。这功能使你可以创建带参数的查询字符串,这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:代码快,参数声明部分,参数赋值部分。说了这么多,还是看看它的语法吧

execute sp_executesql

@stmt = <statement>,--类似存储过程主体

@params = <params>, --类似存储过程参数部分

<params assignment> --类似存储过程调用

@stmt参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你也可以在存储过程中使用sp_executesql;

@params参数与定义输入/输出参数的存储过程头类似,实际上和存储过程头的语法完全一样;

@<params assignment> 与调用存储过程的EXEC部分类似。

从其中可以体会到,sp_executeSql命令比execute命令更加强大,更加灵活,可编译性更强。

 

三:采用C#调用sql中存储过程(得到输出参数的value)

SqlParameter[] param ={
                new SqlParameter("@tableName",SqlDbType.VarChar,15),
                new SqlParameter("@pageIndex",SqlDbType.Int,4),
                new SqlParameter("@pageSize",SqlDbType.Int,4),
                new SqlParameter("@pageCurrent",SqlDbType.Int,4),
                new SqlParameter("@pageNumber",SqlDbType.Int,4),
                new SqlParameter("@pageCount",SqlDbType.Int,4),
                new SqlParameter("@clickType",SqlDbType.VarChar,15),
                new SqlParameter("@keyId",SqlDbType.VarChar,15),
                new SqlParameter("@strWhere",SqlDbType.VarChar,155)              
            };

param[0].Value=""; //为参数赋值

param[1].Value=""

.............................

param[4].Direction= ParameterDirection.Output;   //定义该参数为输出参数

a.如何取得存储过程输出参数:

     pageCount = Convert.ToInt32(scom.Parameters["@pageCount"].Value.ToString());

 

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using My.TB_Model;
using My.TB_Dal;

public partial class MY_Main_rightContent : System.Web.UI.Page
{
    public string htmlText = "";
    protected void Page_Load(object sender, EventArgs e)
    {
            if (Session["User"] != null)
            {
                htmlText += BindPage(15, "XT_Bulletin", "NTID", "NT_Type=1", gvBulletin);
            }
            else
            {
                Response.Write("浏览器会话失效,请重新登录系统!!");
                form1.Style["display"] = "none";
            }
    }

    private string BindPage(int pSize, string tableName, string keyId, string strWhere, Control con)
    {
        int pageIndex = 1;
        int pageCount = 1;
        int pageSize = pSize;

        ////总页数
        int pageYm = 1;

        string clickType = "";
        if (Request.QueryString["cm"] != null)
        {
            clickType = Request.QueryString["cm"].ToString();
        }
        if (Request.QueryString["pageIndex"] != null)
        {
            pageIndex = Convert.ToInt32(Request.QueryString["pageIndex"].ToString());
        }

        SqlParameter[] param ={
                new SqlParameter("@tableName",SqlDbType.VarChar,155),
                new SqlParameter("@pageIndex",SqlDbType.Int,4),
                new SqlParameter("@pageSize",SqlDbType.Int,4),
                new SqlParameter("@pageCurrent",SqlDbType.Int,4),
                new SqlParameter("@pageNumber",SqlDbType.Int,4),
                new SqlParameter("@pageCount",SqlDbType.Int,4),
                new SqlParameter("@clickType",SqlDbType.VarChar,15),
                new SqlParameter("@keyId",SqlDbType.VarChar,15),
                new SqlParameter("@columnName",SqlDbType.VarChar,255),
                new SqlParameter("@strWhere",SqlDbType.VarChar,1000)              
            };
        param[0].Value = tableName;
        param[1].Value = pageIndex;
        param[2].Value = pageSize;
        param[3].Direction = ParameterDirection.Output;
        param[4].Direction = ParameterDirection.Output;
        param[5].Direction = ParameterDirection.Output;
        param[6].Value = clickType;
        param[7].Value = keyId;
        param[8].Value = "*";
        param[9].Value = strWhere;

        DBHelper db = new DBHelper();
        DataSet ds = db.ExcuteProduct("MyPages", param, CommandType.StoredProcedure, out pageCount, out pageIndex, out pageYm);
        if (ds.Tables[0].Rows.Count > 0)
        {
            ((GridView)con).DataSource = ds;
            ((GridView)con).DataBind();
        }
        else
        {
            Command.ShowHeadMethod(ds, ((GridView)con));
        }

        int a = (pageIndex - 6) <= 0 ? 1 : (pageIndex - 6);
        int b = (pageIndex + 6) >= pageYm ? pageYm : (pageIndex + 6);

        htmlText += "<div id=\"pre\" class=\"page\"><a href=\"rightContent.aspx?pageIndex=" + pageIndex + "&cm=pre" + "\"><<</a></div><div class=\"page\">";
        for (int i = a; i <= b; i++)
        {
            htmlText += "<a id=\"L" + i.ToString() + "\" href=\"rightContent.aspx?pageIndex=" + i.ToString() + "\">" + i.ToString() + "</a>";
        }
        htmlText += "</div><div id=\"next\" class=\"page\"><a href=\"rightContent.aspx?pageIndex=" + pageIndex + "&cm=next" + "\">>></a></div>";

        htmlText += "<div class=\"page\"><a style=\"background-image:url(../Images/btn.png);background-repeat:repeat-x;color:white;\">总记录:<font style=\"color:red\">" + pageCount.ToString() + "</font>,页码: <font style=\"color:red\">" + pageIndex + "</font> /" + pageYm.ToString() + " 转到<input type=\"text\" id=\"txtNumber\" style=\"width:31px;height:12px; margin-top:-5px;text-align: center\" value=\"" + pageIndex.ToString() + "\" onfocus=\"this.value=''\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" /> 页</a><a href=\"javascript:void(0)\" onclick=\"GoTo(" + pageYm + ",'../rightContent.aspx'" + ")\">Go</a></div>";
        if (b != 0)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "xa", "pageActive(" + pageIndex + "," + pageYm + ")", true);
        }
        return htmlText;
    }

    protected void gvBulletin_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes["id"] =e.Row.RowIndex.ToString();
            e.Row.Attributes.Add("onclick", "selectx(this,'" + e.Row.RowIndex.ToString() + "')");
            //e.Row.Attributes.Add("ondblclick", "open5(800,550,'XT_Manager/xt_BullDetail.aspx',1,'gvBulletin',1)");  //实现双击事件
            e.Row.Attributes.Add("ondblclick", "openPrint(800,550,'XT_Manager/xt_BullDetail.aspx','"+e.Row.Cells[1].Text+"')");
        }
        //实现自动编号
        //if (e.Row.RowIndex != -1)
        //{
        //    int id = e.Row.RowIndex + 1;
        //    e.Row.Cells[0].Text = id.ToString();
        //}
    }
    protected void gvBulletin_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "titles")
        {
            ClientScript.RegisterStartupScript(this.GetType(), "bx", "<script>openPrint(800,550,'XT_Manager/xt_BullDetail.aspx','" + e.CommandArgument.ToString() + "')</script>");
        }
    }
}

 

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="rightContent.aspx.cs" Inherits="MY_Main_rightContent" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>right内容区域</title>
    <link type="text/css" rel="stylesheet" href="Style/MyPage.css" />
    <script type="text/javascript" src="Js/zDrag.js"></script>
    <script type="text/javascript" src="Js/zDialog.js"></script>
</head>
<body>
    <form id="form1" runat="server">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tr>
                <td style="height: 30px; background: url(Images/tab_05.gif)">
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td style="width: 12px; height: 30px">
                                <img src="Images/tab_03.gif" width="12" height="30" alt="" /></td>
                            <td>
                                <div style="float: left;">
                                    <img src="Images/tb.gif" alt="" /></div>
                                <div style="float: left; line-height: 16px; width: 229px;">
                                    &nbsp;您当前的位置:当前主页&gt;&gt;系统公告
                                </div>
                            </td>
                            <td style="width: 16px">
                                <img src="Images/tab_07.gif" width="16" height="30" alt="" /></td>
                        </tr>
                    </table>
                </td>
            </tr>
            <tr>
                <td valign="top">
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td style="width: 8px; background: url(Images/tab_12.gif);">
                            </td>
                            <td>
                                <table border="0" cellpadding="0" cellspacing="0" style="width: 100%">
                                    <tr>
                                        <td colspan="2">                                      
                                          <div id="gvDiv" class="gvBorder" style="height:auto;">
                                            <asp:GridView ID="gvBulletin" runat="server" AutoGenerateColumns="False" Width="100%" CssClass="gridview_m" OnRowDataBound="gvBulletin_RowDataBound" OnRowCommand="gvBulletin_RowCommand">
                                                <Columns>
                                                    <asp:BoundField DataField="Row" HeaderText="序号">
                                                        <ItemStyle Width="40px" />
                                                    </asp:BoundField>
                                                    <asp:BoundField DataField="NTID" HeaderText="系统编号" >
                                                        <ItemStyle Width="90px" />
                                                    </asp:BoundField>
                                                    <asp:TemplateField HeaderText="公告主题">
                                                        <EditItemTemplate>
                                                            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("NT_Content") %>'></asp:TextBox>
                                                        </EditItemTemplate>
                                                        <ItemTemplate>
                                                          <div style="padding-left:5px; text-align:left;">
                                                            <asp:LinkButton ID="lkContent" runat="server" CommandName="titles" CommandArgument='<%# Eval("NTID") %>' Text='<%# Eval("NT_Content") %>'></asp:LinkButton>
                                                         </div>
                                                        </ItemTemplate>
                                                    </asp:TemplateField>
                                                    <asp:BoundField DataField="NT_Sender" HeaderText="发布人" />
                                                    <asp:TemplateField HeaderText="发布日期">
                                                        <EditItemTemplate>
                                                            <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("NT_Time") %>'></asp:TextBox>
                                                        </EditItemTemplate>
                                                        <ItemTemplate>
                                                            <asp:Label ID="Label1" runat="server" Text='<%# Eval("NT_Time", "{0:yyyy-MM-dd}") %>'></asp:Label>
                                                        </ItemTemplate>
                                                    </asp:TemplateField>
                                                </Columns>
                                                <SelectedRowStyle Font-Bold="True" />
                                                <HeaderStyle CssClass="gridview_head" Font-Bold="True" />
                                            </asp:GridView>
                                         </div>
                                        </td>
                                    </tr>
                                </table>
                            </td>
                            <td style="width: 8px; background: url(Images/tab_15.gif)">
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
            <tr>
                <td style="height: 35px; background: url(Images/tab_19.gif);">
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td style="width: 12px; height: 35px">
                                <img src="Images/tab_18.gif" width="12" height="35" alt="" /></td>
                            <td style="padding-bottom:5px;">
                                <asp:TextBox ID="txtHidd" runat="server" style="display:none; width:1px"></asp:TextBox>
                                <%=htmlText %>
                            </td>
                            <td style="width: 16px">
                                <img src="Images/tab_20.gif" width="16" height="35" alt="" /></td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

  

原创粉丝点击