小弟为了用存储过程实现分页在网上搜了个代码实例,按照他(http://www.bccn.net/Article/net/aspx/jszl/200804/7096)上面照做的。
当我调试的时候出现如下错误
'=' 附近有语法错误。
关键字 'select' 附近有语法错误。
'=' 附近有语法错误。
小弟对sql知道的比较少,希望指点。
C#代码如下
SqlConnection sqlConn = DB.SqlConn();
SqlDataAdapter sqlAdapter = DB.SqlAdapter("dbo.pr_pagination", sqlConn);
DataSet ds = DB.Ds();
sqlAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
sqlAdapter.SelectCommand.Parameters.Add("@tablelist", SqlDbType.NVarChar, 400).Value = "userlogin,commenttitle,commentcontent";
sqlAdapter.SelectCommand.Parameters.Add("@tablename", SqlDbType.NVarChar, 100).Value = "users,usercomment";
sqlAdapter.SelectCommand.Parameters.Add("@selectwhere", SqlDbType.NVarChar, 4000).Value = "where d=1";
sqlAdapter.SelectCommand.Parameters.Add("@selectorderid", SqlDbType.NVarChar, 50).Value = "userid,usercommendid";
sqlAdapter.SelectCommand.Parameters.Add("@selectorder", SqlDbType.NVarChar, 400).Value = "order by commenttime asc";
sqlAdapter.SelectCommand.Parameters.Add("@intpageno", SqlDbType.Int).Value = pageNo;
sqlAdapter.SelectCommand.Parameters.Add("@intpagesize", SqlDbType.Int).Value = pageSize;
sqlAdapter.SelectCommand.Parameters.Add("@recordcount", SqlDbType.Int).Direction = ParameterDirection.Output;
sqlAdapter.SelectCommand.Parameters.Add("rowcount", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
sqlAdapter.Fill(ds, "dbo.pr_pagination");
this.rptComment.DataSource = ds.Tables["dbo.pr_pagination"];
this.rptComment.DataBind();
一下是存储过程代码
use DIS
go
if exists (select 1 from sysobjects where id=OBJECT_ID('dbo.pr_pagination') and type='P')
drop procedure dbo.pr_pagination
go
create procedure dbo.pr_pagination
(
@tablelist nvarchar(400), --搜索表的字段
@tablename nvarchar(100), --搜索表的名称
@selectwhere nvarchar(4000), --搜索条件,注意:不用再写where了
@selectorderid nvarchar(50) output, --表主键字段名称
@selectorder nvarchar(400), --排序,可以使用多字段排序,但主键字段必须放在最前面,也可以不写
@intpageno int=1, --页号
@intpagesize int=1, --每页显示数
@recordcount int output --总记录数(存储过程输出参数)
)
as
declare @tmpselect nvarchar(600)
declare @tmp nvarchar(600)
set nocount on --当为on时表示不返回计数(表示受sql语句影响的行数),当为off时表示返回计数
set @tmpselect='select @recordcount=count(*) from '+@tablename+''+@selectwhere
execute sp_executesql @tmpselect, --执行上面的sql语句
N'@recordcount int output', --执行输出数据的sql语句,output出总记录数
@recordcount output
if(@recordcount=0) --如何没有数据,则返回0
return 0
--判断页数是否正确
if(@intpageno-1)*@intpagesize>@recordcount --页号大于总页数,返回错误
return -1
set nocount off --打开计数
if @selectwhere !=''
begin
set @tmpselect='select top'+STR(@intpagesize)+''+@tablelist
+'from'+@tablename
+'where'+@selectorderid
+'not in(select top '+STR((@intpageno-1)*@intpagesize)+''+@selectorderid
+'from'+@tablename+''+@selectwhere+''+@selectorder+') and '+@selectwhere+''+@selectorder
end
else
begin
set @tmpselect='select top'+str(@intpagesize)+''+@tablelist
+'from'+@tablename
+'where'+@selectorderid
+'not in(select top '+STR((@intpageno-1)*@intpagesize)+''+@selectorderid
+'from'+@tablename+''+@selectorder+')'+@selectorder
end
execute sp_executesql @tmpselect
return(@@rowcount)
go
------解决方案--------------------------------------------------------
看的头晕,你这个通用的分页网上很多,换个吧!而且你这个性能很差!
------解决方案--------------------------------------------------------
先在查询分析器里边
调用这个过程pr_pagination,传一些参数试试.
------解决方案--------------------------------------------------------
我博客有一个代码是我写的。
------解决方案--------------------------------------------------------
教你个简单的.
AspNetPager 7.2控件 下载
工具栏中添加此dll就会在工具栏中看到AspNetPager控件.
移入页面.
- HTML code
<style type="text/css">.paginator { font: 11px Arial, Helvetica, sans-serif;padding:10px 20px 10px 0; margin: 0px;}.paginator a {padding: 1px 6px; border: solid 1px #ddd; background: #fff; text-decoration: none;margin-right:2px}.paginator a:visited {padding: 1px 6px; border: solid 1px #ddd; background: #fff; text-decoration: none;}.paginator .cpb {padding: 1px 6px;font-weight: bold; font-size: 13px;border:none}.paginator a:hover {color: #fff; background: #ffa501;border-color:#ffa501;text-decoration: none;}</style><webdiyer:AspNetPager ID="AspNetPager1" runat="server" CssClass="paginator" CurrentPageButtonClass="cpb" Font-Size="10pt" onpagechanged="AspNetPager1_PageChanged" PageSize="10" FirstPageText="首页" LastPageText="尾页" NextPageText="后页" PrevPageText="前页" SubmitButtonText="Go" TextAfterPageIndexBox="页" TextBeforePageIndexBox="转到" BorderWidth="0px" NumericButtonCount="6"> </webdiyer:AspNetPager></td>
------解决方案--------------------------------------------------------
先用SQL查询分析器看下
估计是你存储过程的问题
------解决方案--------------------------------------------------------
老大,你这个挺吓人的,帮你修改好了,存储过程里有单引号的地方都没有加空格,以后要学会自己调试了。
- SQL code
CREATE procedure dbo.pr_pagination(@tablelist nvarchar(400), --搜索表的字段@tablename nvarchar(100), --搜索表的名称@selectwhere nvarchar(4000), --搜索条件,注意:不用再写where了@selectorderid nvarchar(50) output, --表主键字段名称@selectorder nvarchar(400), --排序,可以使用多字段排序,但主键字段必须放在最前面,也可以不写@intpageno int=1, --页号@intpagesize int=1, --每页显示数@recordcount int output --总记录数(存储过程输出参数))asdeclare @tmpselect nvarchar(600)declare @tmp nvarchar(600)set nocount on --当为on时表示不返回计数(表示受sql语句影响的行数),当为off时表示返回计数set @tmpselect=' select @recordcount=count(*) from ' +@tablename+' ' +@selectwhereexecute sp_executesql @tmpselect, --执行上面的sql语句N' @recordcount int output ' , --执行输出数据的sql语句,output出总记录数@recordcount outputif(@recordcount=0) --如何没有数据,则返回0return 0--判断页数是否正确if(@intpageno-1)*@intpagesize>@recordcount --页号大于总页数,返回错误return -1set nocount off --打开计数if @selectwhere !=' ' beginset @tmpselect=' select top ' +STR(@intpagesize)+' ' +@tablelist+' from' +@tablename+' where' +@selectorderid+' not in(select top ' +STR((@intpageno-1)*@intpagesize)+' ' +@selectorderid+' from' +@tablename+' ' +@selectwhere+' ' +@selectorder+' ) and ' +@selectwhere+' ' +@selectorderendelsebeginset @tmpselect=' select top ' +str(@intpagesize)+' ' +@tablelist+' from ' +@tablename+' where ' +@selectorderid+' not in(select top ' +STR((@intpageno-1)*@intpagesize)+' ' +@selectorderid+' from ' +@tablename+' ' +@selectorder+' ) ' +@selectorderendexecute sp_executesql @tmpselect--print @tmpselect --用print可以输出,用来调试return(@@rowcount)GO
------解决方案--------------------------------------------------------
先用SQL查询分析器看下
估计是你存储过程的问题
--------------
赞同!
execute sp_executesql @tmpselect 对这种执行方法不是很清楚,以前曾试用过几次,有带参数和返回值时都没法实现,后来都改成一般的SQL语句,不调用系统函数来实行。所以也有可能是execute sp_executesql @tmpselect 这个的问题