在這里,感謝所有csdn blog上貼過(guò)相關(guān)主題貼子的兄弟,下面的方法是建立在csdn blog上七篇關(guān)于分頁(yè)存儲(chǔ)過(guò)程的基礎(chǔ)上的
前段時(shí)間研究分頁(yè)的時(shí)候,在csdn的blog上看到了一位兄弟寫(xiě)的分頁(yè)存儲(chǔ)過(guò)程,發(fā)現(xiàn)非常好,于是,就使用了這個(gè)存儲(chǔ)過(guò)程,下面是原版的分頁(yè)存儲(chǔ)過(guò)程
--開(kāi)始 
create procedure getrecordfrompage 
    @tblname      varchar(255),       -- 表名 
    @fldname      varchar(255),       -- 字段名 
    @pagesize     int = 10,           -- 頁(yè)尺寸 
    @pageindex    int = 1,            -- 頁(yè)碼 
    @iscount      bit = 0,            -- 返回記錄總數(shù), 非 0 值則返回 
    @ordertype    bit = 0,            -- 設(shè)置排序類型, 非 0 值則降序 
    @strwhere     varchar(1000) = ’’  -- 查詢條件 (注意: 不要加 where) 
as 
declare  @strsql   varchar(1000)     -- 主語(yǔ)句 
declare @strtmp   varchar(300)     -- 臨時(shí)變量 
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 
--結(jié)束 
當(dāng)我在用這個(gè)存儲(chǔ)過(guò)程的時(shí)候,剛開(kāi)始沒(méi)有發(fā)現(xiàn)問(wèn)題,后來(lái)當(dāng)我的條件很復(fù)雜的時(shí)候,發(fā)現(xiàn),此存儲(chǔ)過(guò)程執(zhí)行遇到錯(cuò)誤,下面是出現(xiàn)問(wèn)題的條件 
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 
照說(shuō)這個(gè)條件是沒(méi)有問(wèn)題的,可是,用上面的存儲(chǔ)過(guò)程執(zhí)行,卻老是報(bào)告錯(cuò)誤 
后來(lái),經(jīng)調(diào)試,輸出生成后的sql語(yǔ)句,發(fā)現(xiàn),原來(lái)問(wèn)題是出現(xiàn)在嵌套的sql語(yǔ)句中使用的()身上,于是,我把存儲(chǔ)過(guò)程改為下面的效果,終于排除了bug,下面的存儲(chǔ)過(guò)程不管你的條件有多復(fù)雜,只要格式正確,就能運(yùn)行 
create procedure getrecordfrompage 
    @tblname      varchar(255),       -- 表名 
    @fldname      varchar(255),       -- 字段名 
    @pagesize     int = 10,           -- 頁(yè)尺寸 
    @pageindex    int = 1,            -- 頁(yè)碼 
    @iscount      bit = 0,            -- 返回記錄總數(shù), 非 0 值則返回 
    @ordertype    bit = 0,            -- 設(shè)置排序類型, 非 0 值則降序 
    @strwhere     varchar(1000) = ’’  -- 查詢條件 (注意: 不要加 where) 
as 
declare  @strsql   varchar(1000)     -- 主語(yǔ)句 
declare @strtmp   varchar(300)     -- 臨時(shí)變量 
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 
要注意看,修改后的存儲(chǔ)過(guò)程在使用@strwhere時(shí),都在其前后加上了(),這樣,就防止嵌套的()出現(xiàn)錯(cuò)誤
下面的代碼是引用該存儲(chǔ)過(guò)程的一個(gè)范例
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(); 
在這里,要注意的是存儲(chǔ)過(guò)程使用的pageindex變量是從1開(kāi)始
   
   
  
  
  回復(fù)人: heroman1979(網(wǎng)絡(luò)蟲(chóng)子) ( ) 信譽(yù):96  2004-8-19 18:24:44  得分: 0   
  
  
    
最后,再排除一個(gè)bug 
將存儲(chǔ)過(guò)程中 
declare  @strsql   varchar(1000)     -- 主語(yǔ)句 
declare @strtmp   varchar(300)     -- 臨時(shí)變量 
declare @strorder varchar(400)       -- 排序類型 
改為 
declare  @strsql   varchar(2000)     -- 主語(yǔ)句 
declare @strtmp   varchar(1000)     -- 臨時(shí)變量 
declare @strorder varchar(1000)       -- 排序類型 
因?yàn)槲以谡{(diào)試中發(fā)現(xiàn)有些查詢用的語(yǔ)句選不止300 
最后,只要將以上存儲(chǔ)過(guò)程代碼復(fù)制并加入到你的數(shù)據(jù)庫(kù)中,再按照范例來(lái)調(diào)用即可了 
新聞熱點(diǎn)
疑難解答
圖片精選