为什么我这样执行 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();
}
[解决办法]
这个分页的存储过程问题大了。 再找个别的吧。