当前位置: 代码迷 >> ASP.NET >> sql语句有关问题。让小弟我很头痛
  详细解决方案

sql语句有关问题。让小弟我很头痛

热度:2779   发布时间:2013-02-25 00:00:00.0
sql语句问题。让我很头痛
小弟为了用存储过程实现分页在网上搜了个代码实例,按照他(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 这个的问题
  相关解决方案