日期:2014-05-18  浏览次数:20821 次

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

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   

    --+ 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) = '*',