首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

为什么小弟我这样执行 SQL分页存储过程会出错?

2012-02-25 
为什么我这样执行 SQL分页存储过程会出错??SQL codeset ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER pr

为什么我这样执行 SQL分页存储过程会出错??

SQL code
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER procedure [dbo].[SqlPage]     @TableName varchar(50),                  --表或视图名    @Fields varchar(5000) = '*',              --字段名(全部字段为*)    @OrderFields varchar(5000),            --排序字段(必须!支持多字段,建议建索引)    @SqlWhere varchar(5000) = '',         --条件语句(如and Name='a')    @PageSize int,                                     --每页多少条记录    @PageIndex int = 1 ,                        --指定当前为第几页    @TotalPages int output                    --返回总页数 asbegin    declare @sql nvarchar(4000)    declare @TotalRecords int       --+ 50, p.Y));  


C# code
    private void Page(String Id)    {        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString))        {            using (SqlDataAdapter Da = new SqlDataAdapter("SqlPage", conn))            {                Da.SelectCommand.Parameters.Add(new SqlParameter("@TableName","Article"));                Da.SelectCommand.Parameters.Add(new SqlParameter("@Fields","Id,Title,AddTime"));                Da.SelectCommand.Parameters.Add(new SqlParameter("@OrderFields"," order by id desc"));                Da.SelectCommand.Parameters.Add(new SqlParameter("@SqlWhere",""));                Da.SelectCommand.Parameters.Add(new SqlParameter("@PageSize",30));                Da.SelectCommand.Parameters.Add(new SqlParameter("@PageIndex",1));                SqlParameter Para=new SqlParameter("@TotalPages",SqlDbType.Int);                Para.Direction = ParameterDirection.Output;                Da.SelectCommand.Parameters.Add(Para);                DataSet Dt = new DataSet();                Da.Fill(Dt);                GridView1.DataSource = Dt;                GridView1.DataBind();                conn.Close();            }        }    }


“/”应用程序中的服务器错误。

'SqlPage' 附近有语法错误。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.Data.SqlClient.SqlException: 'SqlPage' 附近有语法错误。

源错误: 


行 34: Da.SelectCommand.Parameters.Add(Para);
行 35: DataSet Dt = new DataSet();
行 36: Da.Fill(Dt);
行 37: GridView1.DataSource = Dt;
行 38: GridView1.DataBind();

[解决办法]
http://blog.csdn.net/xtjcmeva/archive/2009/01/06/3720502.aspx

你可以看一下上面网址的代码,是我写的,测试能通过,我觉得你的分页存储过程没有必要太多参数,因为你的这部分:
@TableName varchar(50), --表或视图名
@Fields varchar(5000) = '*', --字段名(全部字段为*)
@OrderFields varchar(5000), --排序字段(必须!支持多字段,建议建索引)
@SqlWhere varchar(5000) = '', --条件语句(如and Name='a')
完全可以通过一条SQL命令就搞定的.
你先看看我给出网址的代码吧
[解决办法]
set @sql = 'select '+ @Fields + ' from (select top(@PageIndex*@PageSize)


 不能这么写
[解决办法]
Convert(nvarchar(20),@PageIndex*@PageSize) 写在引号外。不然没有声明了。 你的这个分页储存过程错误。
[解决办法]
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

alter procedure [dbo].[SqlPage] 
@TableName varchar(50), --表或视图名
@Fields varchar(5000) = '*', --字段名(全部字段为*)
@OrderFields varchar(5000), --排序字段(必须!支持多字段,建议建索引)


@SqlWhere varchar(5000) = '', --条件语句(如and Name='a')
@PageSize int, --每页多少条记录
@PageIndex int = 1 , --指定当前为第几页
@TotalPages int output --返回总页数 
as
begin
declare @sql nvarchar(4000)
declare @TotalRecords int

--计算总记录数及总页数
set @sql = 'select @TotalRecords = count(*) from ' + @TableName + ' where 1=1 ' + @sqlWhere
exec sp_executesql @sql,N'@totalRecords int output',@TotalRecords output
select @TotalPages=CEILING((@TotalRecords+0.0)/@PageSize)
print @TotalPages
--处理页数超出范围情况
if @PageIndex<=0 
set @PageIndex = 1
if @PageIndex>@TotalPages
set @PageIndex = @TotalPages 
print @PageIndex
print @PageSize
set @sql = 'select '+ @Fields + ' from (select top('+Convert(nvarchar(20),@PageIndex*@PageSize)+') ' + @Fields + ',row_number() over(order by ' + @OrderFields + ') as rowNumber from ' + @TableName + ' where 1=1 ' + @SqlWhere + ') t where t.rowNumber >= ('+Convert(nvarchar(20),(@PageIndex-1)*@PageSize+1)+')'

print @Sql
exec sp_executesql @sql,N'@PageIndex int, @PageSize int',@PageIndex,@PageSize
end
[解决办法]
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB88ConnectionString"].ConnectionString))
{
using (SqlDataAdapter Da = new SqlDataAdapter("SqlPage", conn))
{
Da.SelectCommand.Parameters.Add(new SqlParameter("@TableName", "Article"));
Da.SelectCommand.Parameters.Add(new SqlParameter("@Fields", "Id,Title,AddTime"));
Da.SelectCommand.Parameters.Add(new SqlParameter("@OrderFields", " id desc"));
Da.SelectCommand.Parameters.Add(new SqlParameter("@SqlWhere", ""));
Da.SelectCommand.Parameters.Add(new SqlParameter("@PageSize", 30));
Da.SelectCommand.Parameters.Add(new SqlParameter("@PageIndex", 1));
SqlParameter Para = new SqlParameter("@TotalPages", SqlDbType.Int);
Para.Direction = ParameterDirection.Output;
Da.SelectCommand.Parameters.Add(Para);
DataSet Dt = new DataSet();
Da.Fill(Dt);
//GridView1.DataSource = Dt;
// GridView1.DataBind();
conn.Close();

}
[解决办法]
这个分页的存储过程问题大了。 再找个别的吧。

热点排行