冷枫@CSDN

CSharp程序员大本营:积累平凡就是积累卓越!有了翅膀,你就有了天空!钝到极点的刀才最具杀伤力——因为它是锤子!

用户操作
[即时聊天] [发私信] [加为好友]
宋巍巍ID:JavaProgramers
483353次访问,排名98好友111人,关注者141
毕业于南阳理工学院计算机系软件工程专业,一直从事于软件开发工作,编程经验5年,一线程序员出身,开发实战经验丰富,精通Asp,Asp.NET, ERP(C#.NET),基于WEB(Asp.Net)的MIS等世道上的一般编程,精通SQL Server存储过程开发,曾为一家中型商务企业软件开发工程师,软件培训师。
JavaProgramers的文章
原创 287 篇
翻译 0 篇
转载 24 篇
评论 441 篇
╄ 冷枫的公告
╄ 冷枫 Asp.NET微软MVP
本Blog技术支持QQ群
[NET技术联盟]:1908832
[冷枫开发小组]:6307410
CSharp开放源码促进会
CSharp程序员大本营
最近评论
反对垄断:现在都在卖服务,软件都是白送的,微软降到100多就想笼络人心,做梦,微软迟早要完蛋
wyw_2002:“中国用户的计算机中60%都运行微软的操作系统“

请问这个60%是你统计的吗?
那40%是什么系统?

捡瓶子:废瓶子1角钱一个,一天捡100个,10元,跑去吃饭8元,买个XP,也要捡2年啊!
zenggang2008:反击盗版,在中国还有很长的路要走啊
大家都已经习惯"免费"了
路过:盗版不利于中国的软件业的发展,最终用户好像在盗版软件中得到了很多的好处,但是把中国的软件产业搞垮了。最终用户最后还是受害者。
文章分类
收藏
    相册
    IT英雄传奇
    大学留念集
    公司一角
    旅游系列二
    旅游系列三
    旅游系列一
    [╄ 冷枫]简介
    站长简介(RSS)
    经典网站收集
    .NET分页存储过程
    AJAX中国
    DOTNET控件网
    DotNet男孩社区
    Java共舞
    Tutorails[.NET]
    中国盟动力
    冷枫技术论坛
    开发者在线
    技术无极限(RSS)
    深圳赶集网
    源码网
    软件项目网
    网上邻居
    『 天道酬勤 』(RSS)
    『 孟子E章 』(RSS)
    『 孟子E章 』
    『 邹建专栏 』(RSS)
    『webdiyer 』
    微软官方
    ASP.NET 入门教程
    webcast视频教程
    存档
    订阅我的博客
    XML聚合  FeedSky

    转载 原版的分页存储过程收藏

    新一篇: Freetextbox的使用 | 旧一篇: Struts程序设计之HelloWord实战入门篇

    --开始
    CREATE PROCEDURE GetRecordFromPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 字段名
        @PageSize     int = 10,           -- 页尺寸
        @PageIndex    int = 1,            -- 页码
        @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
        @OrderType    bit = 0,            -- 设置排序型, 非 0 值则降序
        @strWhere     varchar(1000) = ’’  -- 查询条件 (注意: 不要加 where)
    AS

    declare  @strSQL   varchar(1000)     -- 主语句
    declare @strTmp   varchar(300)     -- 临时变量
    declare @strOrder varchar(400)       -- 排序

    if @OrderType != 0
    begin
        set @strTmp = "<(select min"
        set @strOrder = " order by [" + @fldName +"] desc"
    end
    else
    begin
        set @strTmp = ">(select max"
        set @strOrder = " order by [" + @fldName +"] asc"
    end

    set @strSQL = "select top " + str(@PageSize) + " * from ["
        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
        + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
        + @strOrder

    if @strWhere != ’’
        set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
            + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
            + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
            + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

    if @PageIndex = 1
    begin
        set @strTmp = ""
        if @strWhere != ’’
            set @strTmp = " where " + @strWhere 

        set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "]" + @strTmp + " " + @strOrder
    end

    if @IsCount != 0
        set @strSQL = "select count(*) as Total from [" + @tblName + "]"

    exec (@strSQL)
    GO
    --结束

    当我在用这个存储过程的时候,刚开始没有发现问题,后来当我的条件很复杂的时候,发现,此存储过程执行遇到错误,下面是出现问题的条件
    id<>0 and (companyenname like ’%shenzhen%’ or companychname like ’%shenzhen%’ or web like ’%shenzhen%’ or memo like ’%shenzhen%’  or address like ’%shenzhen%’)  order by [id] desc) as tblTmp) and id<>0 and (companyenname like ’%shenzhen%’ or companychname like ’%shenzhen%’ or web like ’%shenzhen%’ or memo like ’%shenzhen%’  or address like ’%shenzhen%’) and salesid=9
    照说这个条件是没有问题的,可是,用上面的存储过程执行,却老是报告错误
    后来,经调试,输出生成后的SQL语句,发现,原来问题是出现在嵌套的SQL语句中使用的()身上,于是,我把存储过程改为下面的效果,终于排除了BUG,下面的存储过程不管你的条件有多复杂,只要格式正确,就能运行
    CREATE PROCEDURE GetRecordFromPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 字段名
        @PageSize     int = 10,           -- 页尺寸
        @PageIndex    int = 1,            -- 页码
        @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
        @OrderType    bit = 0,            -- 设置排序型, 非 0 值则降序
        @strWhere     varchar(1000) = ’’  -- 查询条件 (注意: 不要加 where)
    AS

    declare  @strSQL   varchar(1000)     -- 主语句
    declare @strTmp   varchar(300)     -- 临时变量
    declare @strOrder varchar(400)       -- 排序

    if @OrderType != 0
    begin
        set @strTmp = "<(select min"
        set @strOrder = " order by [" + @fldName +"] desc"
    end
    else
    begin
        set @strTmp = ">(select max"
        set @strOrder = " order by [" + @fldName +"] asc"
    end

    set @strSQL = "select top " + str(@PageSize) + " * from ["
        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
        + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
        + @strOrder

    if @strWhere != ’’
        set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
            + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
            + @fldName + "] from [" + @tblName + "] where (" + @strWhere + ") "
            + @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder

    if @PageIndex = 1
    begin
        set @strTmp = ""
        if @strWhere != ’’
            set @strTmp = " where (" + @strWhere + ")"

        set @strSQL = "select top " + str(@PageSize) + " * from ["
            + @tblName + "]" + @strTmp + " " + @strOrder
    end

    if @IsCount != 0
        set @strSQL = "select count(*) as Total from [" + @tblName + "]"

    exec (@strSQL)
    GO

    要注意看,修改后的存储过程在使用@strWhere时,都在其前后加上了(),这样,就防止嵌套的()出现错误

    下面的代码是引用该存储过程的一个范例 

    SqlConnection MyConnection=new SqlConnection(ConfigurationSettings.AppSettings["dsn"]);
       DataSet MyDataSet=new DataSet();
       string strKeyword=Keyword.Text.Trim().Replace("\’","\’\’");
       string strSalesId=Sales.SelectedItem.Value;
       int RecordCount=CalcRecordCount();
       RecordNumber.Text=RecordCount.ToString();
       LblRecordNumber.Text=RecordCount.ToString();
       string strExpress="Id<>0";
       if (strKeyword!="")
        strExpress=strExpress+" and (companyenname like ’%"+strKeyword+"%’ or companychname like ’%"+strKeyword+"%’ or Companyshortname like ’%"+strKeyword+"%’ or web like ’%"+strKeyword+"%’ or mainproduct like ’%"+strKeyword+"%’ or phone like ’%"+strKeyword+"%’ or memo like ’%"+strKeyword+"%’ or address like ’%"+strKeyword+"%’ or linkmanphone like ’%"+strKeyword+"%’)";
       if (strSalesId!="")
        strExpress=strExpress+" and salesid="+strSalesId;   
       SqlCommand MyCommand=new SqlCommand();
       MyCommand.Connection=MyConnection;
       MyCommand.CommandText="GetRecordFromPage";
       MyCommand.CommandType=CommandType.StoredProcedure;
       MyCommand.Parameters.Add("@tblName","customerview");
       MyCommand.Parameters.Add("@fldName","id");
       MyCommand.Parameters.Add("@strWhere",strExpress);
       MyCommand.Parameters.Add("@PageSize",Int32.Parse(CustomerList.PageSize.ToString()));
       MyCommand.Parameters.Add("@PageIndex",Int32.Parse(ViewState["PageIndex"].ToString())+1);
       SqlDataReader MyReader;
       MyConnection.Open();
       MyReader=MyCommand.ExecuteReader();   
       CustomerList.VirtualItemCount=RecordCount;
       CustomerList.DataSource=MyReader;
       CustomerList.DataKeyField="id";
       CustomerList.DataBind();
       MyReader.Close();
       MyConnection.Close();

    在这里,要注意的是存储过程使用的PAGEINDEX变量是从1开始 

    最后,再排除一个BUG
    将存储过程中
    declare  @strSQL   varchar(1000)     -- 主语句
    declare @strTmp   varchar(300)     -- 临时变量
    declare @strOrder varchar(400)       -- 排序
    改为
    declare  @strSQL   varchar(2000)     -- 主语句
    declare @strTmp   varchar(1000)     -- 临时变量
    declare @strOrder varchar(1000)       -- 排序

    因为我在调试中发现有些查询用的语句选不止300
    最后,只要将以上存储过程代码复制并加入到你的数据库中,再按照范例来调用即可了 

     

    发表于 @ 2006年07月23日 05:38:00|评论(loading...)|编辑

    新一篇: Freetextbox的使用 | 旧一篇: Struts程序设计之HelloWord实战入门篇

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © ╄ 冷枫