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