问题描述
CREATEPROCsp_PageView@tbnamesysname,--要分页显示的表名@FieldKeynvarchar(1000),--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段@PageCurrentint=1,--要显示的页码@PageSizeint=10,--每页的大小(记录数)@FieldShownvarchar(1000)='',--以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段@FieldOrdernvarchar(1000)='',--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC--用于指定排序顺序@Wherenvarchar(1000)='',--查询条件@PageCountintOUTPUT--总页数ASSETNOCOUNTON--检查对象是否有效IFOBJECT_ID(@tbname)ISNULLBEGINRAISERROR(N'对象"%s"不存在',1,16,@tbname)RETURNENDIFOBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0ANDOBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0ANDOBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0BEGINRAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)RETURNEND--分页字段检查IFISNULL(@FieldKey,N'')=''BEGINRAISERROR(N'分页处理需要主键(或者惟一键)',1,16)RETURNEND--其他参数检查及规范IFISNULL(@PageCurrent,0)<1SET@PageCurrent=1IFISNULL(@PageSize,0)<1SET@PageSize=10IFISNULL(@FieldShow,N'')=N''SET@FieldShow=N'*'IFISNULL(@FieldOrder,N'')=N''SET@FieldOrder=N''ELSESET@FieldOrder=N'ORDERBY'+LTRIM(@FieldOrder)IFISNULL(@Where,N'')=N''SET@Where=N''ELSESET@Where=N'WHERE('+@Where+N')'--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)IF@PageCountISNULLBEGINDECLARE@sqlnvarchar(4000)SET@sql=N'SELECT@PageCount=COUNT(*)'+N'FROM'+@tbname+N''+@WhereEXECsp_executesql@sql,N'@PageCountintOUTPUT',@PageCountOUTPUTSET@PageCount=(@PageCount+@PageSize-1)/@PageSizeEND--计算分页显示的TOPN值DECLARE@TopNvarchar(20),@TopN1varchar(20)SELECT@TopN=@PageSize,@TopN1=(@PageCurrent-1)*@PageSize--第一页直接显示IF@PageCurrent=1EXEC(N'SELECTTOP'+@TopN+N''+@FieldShow+N'FROM'+@tbname+N''+@Where+N''+@FieldOrder)ELSEBEGIN--处理别名IF@FieldShow=N'*'SET@FieldShow=N'a.*'--生成主键(惟一键)处理条件DECLARE@Where1nvarchar(4000),@Where2nvarchar(4000),@snvarchar(1000),@FieldsysnameSELECT@Where1=N'',@Where2=N'',@s=@FieldKeyWHILECHARINDEX(N',',@s)>0SELECT@Field=LEFT(@s,CHARINDEX(N',',@s)-1),@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),@Where1=@Where1+N'ANDa.'+@Field+N'=b.'+@Field,@Where2=@Where2+N'ANDb.'+@Field+N'ISNULL',@Where=REPLACE(@Where,@Field,N'a.'+@Field),@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)SELECT@Where=REPLACE(@Where,@s,N'a.'+@s),@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),@Where1=STUFF(@Where1+N'ANDa.'+@s+N'=b.'+@s,1,5,N''),@Where2=CASEWHEN@Where=''THENN'WHERE('ELSE@Where+N'AND('END+N'b.'+@s+N'ISNULL'+@Where2+N')'--执行查询EXEC(N'SELECTTOP'+@TopN+N''+@FieldShow+N'FROM'+@tbname+N'aLEFTJOIN(SELECTTOP'+@TopN1+N''+@FieldKey+N'FROM'+@tbname+N'a'+@Where+N''+@FieldOrder+N')bON'+@Where1+N''+@Where2+N''+@FieldOrder)END
EDbOperatoroo=newEDbOperator();oo.DbOperator.IsStoredProcedure=true;oo.DbOperator.Parameters.Clear();oo.DbOperator.Parameters.Add(MyParameter.Sql("@tbname",ParameterDbType.VarChar,200,ParameterDirection.Input,TableName));oo.DbOperator.Parameters.Add(MyParameter.Sql("@FieldShow",ParameterDbType.VarChar,2000,ParameterDirection.Input,FieldList));oo.DbOperator.Parameters.Add(MyParameter.Sql("@FieldKey",ParameterDbType.VarChar,100,ParameterDirection.Input,PrimaryKey));oo.DbOperator.Parameters.Add(MyParameter.Sql("@Where",ParameterDbType.VarChar,1000,ParameterDirection.Input,iWhere.ToString()));oo.DbOperator.Parameters.Add(MyParameter.Sql("@FieldOrder",ParameterDbType.VarChar,1000,ParameterDirection.Input,Order));oo.DbOperator.Parameters.Add(MyParameter.Sql("@PageSize",ParameterDbType.Int,4,ParameterDirection.Input,PageSize));oo.DbOperator.Parameters.Add(MyParameter.Sql("@PageCurrent",ParameterDbType.Int,4,ParameterDirection.Input,PageIndex));System.Data.SqlClient.SqlParameterpram=newSystem.Data.SqlClient.SqlParameter("@PageCount",SqlDbType.Int,4);pram.Direction=ParameterDirection.Output;oo.DbOperator.Parameters.Add(pram);DataSetds=newDataSet();oo.DbOperator.ExecDataSet("sp_PageView",ds);System.Data.SqlClient.SqlParameterpr=(System.Data.SqlClient.SqlParameter)oo.DbOperator.Parameters[7];RecordCount=Convert.ToInt32(pr.Value);returnds.Tables[0];
取得的总记录数都为null呢我得不了记录总数啊谢谢
解决方案
解决方案二:
在数据库中执行这个存储过程是否正常?
解决方案三:
学习
解决方案四:
up
解决方案五:
--执行查询EXEC(N'SELECTTOP'+@TopN+N''+@FieldShow+N'FROM'+@tbname+N'aLEFTJOIN(SELECTTOP'+@TopN1+N''+@FieldKey+N'FROM'+@tbname+N'a'+@Where+N''+@FieldOrder+N')bON'+@Where1+N''+@Where2+N''+@FieldOrder)首先用printf(N'SELECTTOP'+@TopN+N''+@FieldShow+N'FROM'+@tbname+N'aLEFTJOIN(SELECTTOP'+@TopN1+N''+@FieldKey+N'FROM'+@tbname+N'a'+@Where+N''+@FieldOrder+N')bON'+@Where1+N''+@Where2+N''+@FieldOrder)看看sql是不是有问题.或者直接执行一下,看看存储过程本身是不是能work.保证了上面的步骤没有问题,再检查你的code.请先自己尝试找小原因,这样比直接问别人,更能提高.
解决方案六:
测试存储过程,检查pram的值RecordCount=Convert.ToInt32(pram.Value);
解决方案七:
执行存储过程没有问题吧?
解决方案八:
ds.tables(0).rows.count就是记录数了
解决方案九:
ds.tables(0).rows.count就是记录数了这个只是测试到返回的数量