存储过程返回参数为空

a285921021 2008-09-15 02:49:37
在数据交换层的代码,下面红色部分写的应该是没问题吧,可是我在界面层调用这个的时候返回来的2个都是“0”啊,怎么会这样,但是其他数据都可以接到,就是这2个为0,而且我的存储过程是没问题的,不用三层架构的时候可以返回这2个数。代码如下:
       public DataSet PageDs(PageCut PC, out int pagecount, out int recordcount)
{
StringBuilder sb = new StringBuilder();
sb.Append("GetRecordFromPage");
SqlParameter[] parm ={new SqlParameter("@tbname",SqlDbType.VarChar,255),
new SqlParameter("@FieldShow",SqlDbType.VarChar,255),
new SqlParameter("@FieldKey",SqlDbType.VarChar,255),
new SqlParameter("@FieldOrder",SqlDbType.VarChar,255),
new SqlParameter("@Where",SqlDbType.VarChar,2000),
new SqlParameter("@pageSize",SqlDbType.Int,4),
new SqlParameter("@PageCurrent",SqlDbType.Int,4),
new SqlParameter("@RecordCount",SqlDbType.Int,4),
new SqlParameter("@PageCount",SqlDbType.Int,4)};
parm[0].Value = PC.tbname;
parm[1].Value = PC.FieldShow;
parm[2].Value = PC.FieldKey;
parm[3].Value = PC.FieldOrder;
parm[4].Value = PC.Where;
parm[5].Value = PC.pagesize;
parm[6].Value = PC.PageCurrent;
parm[7].Direction = ParameterDirection.Output;
parm[8].Direction = ParameterDirection.Output;

pagecount =Convert.ToInt32(parm[8].Value);
recordcount = Convert.ToInt32(parm[7].Value);
return SqlHelper.ExecuteDataSet(SqlHelper.ConnectionStringLocalTransaction,CommandType.StoredProcedure,sb.ToString(),parm);
}
...全文
177 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
a285921021 2008-09-15
  • 打赏
  • 举报
回复
我终于知道为什么了,你们看我这句
pagecount =Convert.ToInt32(parm[8].Value);
recordcount = Convert.ToInt32(parm[7].Value);
return SqlHelper.ExecuteDataSet(SqlHelper.ConnectionStringLocalTransaction,CommandType.StoredProcedure,sb.ToString(),parm);
}
我在执行return之前就已经把值给了pagecount和recordcount,所以我要先执行取得dataset

所以上面我改了下:
dataset ds=SqlHelper.ExecuteDataSet(SqlHelper.ConnectionStringLocalTransaction,CommandType.StoredProcedure,sb.ToString(),parm);
};
pagecount =Convert.ToInt32(parm[8].Value);
recordcount = Convert.ToInt32(parm[7].Value);
return ds;

搞定了,谢谢大家

a285921021 2008-09-15
  • 打赏
  • 举报
回复
你们看,我用这种方法又可以返回这2个参数,但是用到三层架构来传好象就不行了,大家帮我看下有没有什么区别啊,最起码这可以证明我的存储过程是没问题的吧

using System;

using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Data.SqlClient;

public partial class lllll : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
Gbind();
}
}
public DataSet returnDS(out int pagecount,out int recordcount)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ad_518"]);
conn.Open();
SqlDataAdapter sdr = new SqlDataAdapter("GetRecordFromPage", conn);
sdr.SelectCommand.CommandType = CommandType.StoredProcedure;
sdr.SelectCommand.Parameters.Add("@tbname", SqlDbType.VarChar, 255).Value = "smallclasser";
sdr.SelectCommand.Parameters.Add("@FieldShow", SqlDbType.VarChar, 255).Value = "";
sdr.SelectCommand.Parameters.Add("@FieldKey", SqlDbType.VarChar, 255).Value = "id";
sdr.SelectCommand.Parameters.Add("@FieldOrder", SqlDbType.VarChar, 255).Value = " id desc";
sdr.SelectCommand.Parameters.Add("@pageSize", SqlDbType.Int, 4).Value = "15";
sdr.SelectCommand.Parameters.Add("@PageCurrent", SqlDbType.Int, 4).Value = "7";
sdr.SelectCommand.Parameters.Add("@PageCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;

sdr.SelectCommand.Parameters.Add("@Where", SqlDbType.VarChar, 2000).Value = "";
sdr.SelectCommand.Parameters.Add("@RecordCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;

DataSet ds = new DataSet();

sdr.Fill(ds);
pagecount = Convert.ToInt32(sdr.SelectCommand.Parameters["@PageCount"].Value.ToString());
recordcount = Convert.ToInt32(sdr.SelectCommand.Parameters["@RecordCount"].Value.ToString());
return ds;
}
void Gbind()
{
int pageno = 1;
int pagesize = 10;
try
{
if (Request.QueryString["pageno"] == "" || Request.QueryString["pageno"] == null)
{
pageno = 1;
}
else
{
pageno = Convert.ToInt32(Request.QueryString["pageno"]);
}
}
catch
{
pageno = 1;
}

int pagecount;
int recordcount;
this.GridView1.DataSource = returnDS(out pagecount,out recordcount);
Response.Write(pagecount+"<br>"+recordcount);
this.GridView1.DataBind();

}
}
a285921021 2008-09-15
  • 打赏
  • 举报
回复
求大家帮帮我吧
ZengHD 2008-09-15
  • 打赏
  • 举报
回复
没条件帮你测试
你可以在储存过程的最前面先给@PageCount和@RecordCount赋初值,看能不能获取到这个值
a285921021 2008-09-15
  • 打赏
  • 举报
回复
可是我这样写他又是可以返回这2个数的啊,这2个代码效果不是一样吗?

public DataSet returnDS(out int paleta)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ad_518"]);
conn.Open();
SqlDataAdapter sdr = new SqlDataAdapter("GetRecordFromPage", conn);
sdr.SelectCommand.CommandType = CommandType.StoredProcedure;
sdr.SelectCommand.Parameters.Add("@tbname", SqlDbType.VarChar, 255).Value = "smallclasser";
sdr.SelectCommand.Parameters.Add("@FieldShow", SqlDbType.VarChar, 255).Value = "";
sdr.SelectCommand.Parameters.Add("@FieldKey", SqlDbType.VarChar, 255).Value = "id";
sdr.SelectCommand.Parameters.Add("@FieldOrder", SqlDbType.VarChar, 255).Value = " id desc";
sdr.SelectCommand.Parameters.Add("@pageSize", SqlDbType.Int, 4).Value = "15";
sdr.SelectCommand.Parameters.Add("@PageCurrent", SqlDbType.Int, 4).Value = "7";


sdr.SelectCommand.Parameters.Add("@Where", SqlDbType.VarChar, 2000).Value = "id>1000";
sdr.SelectCommand.Parameters.Add("@PageCount", SqlDbType.Int, 4).Direction = ParameterDirection.Output;

DataSet ds = new DataSet();
paleta = Convert.ToInt32(sdr.SelectCommand.Parameters["@PageCount"].Value.ToString());
sdr.Fill(ds);
return ds;
}
void Gbind()
{
int pageno=1;
int pagesize = 10;
try
{
if (Request.QueryString["pageno"] == "" || Request.QueryString["pageno"] == null)
{
pageno = 1;
}
else
{
pageno = Convert.ToInt32(Request.QueryString["pageno"]);
}
}
catch
{
pageno = 1;
}

int paleta;
this.GridView1.DataSource = returnDS(out paleta);
Response.Write(paleta);
this.GridView1.DataBind();

}
ZengHD 2008-09-15
  • 打赏
  • 举报
回复
可能你的存储过程里还没有赋值就RETURN了
a285921021 2008-09-15
  • 打赏
  • 举报
回复
存储过程:

CREATE PROC GetRecordFromPage
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT, --总页数
@RecordCount int OUTPUT --总记录数
AS
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
END
IF @RecordCount IS NULL
SET @RecordCount = @PageCount

SET @PageCount=(@PageCount+@PageSize-1)/@PageSize

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@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' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
GO
a285921021 2008-09-15
  • 打赏
  • 举报
回复
我不用三层架构就能够返回这2个数的
Robin 2008-09-15
  • 打赏
  • 举报
回复
应该是存储过程有问题
a285921021 2008-09-15
  • 打赏
  • 举报
回复
PageDs的值是有的,可以返回这个DATASET,数据绑定都正常
就是这2个返回来的参数是0
ZengHD 2008-09-15
  • 打赏
  • 举报
回复
单步调试PageDs, pagecount 和 recordcount 也是为0吗
ZengHD 2008-09-15
  • 打赏
  • 举报
回复
也指定了parm[7].Direction = ParameterDirection.Output;
这还真看不出哪里错了
a285921021 2008-09-15
  • 打赏
  • 举报
回复
public DataSet PageDs(PageCut PC, out int pagecount, out int recordcount)
{
StringBuilder sb = new StringBuilder();
sb.Append("GetRecordFromPage");
SqlParameter[] parm ={new SqlParameter("@tbname",SqlDbType.VarChar,255),
new SqlParameter("@FieldShow",SqlDbType.VarChar,255),
new SqlParameter("@FieldKey",SqlDbType.VarChar,255),
new SqlParameter("@FieldOrder",SqlDbType.VarChar,255),
new SqlParameter("@Where",SqlDbType.VarChar,2000),
new SqlParameter("@pageSize",SqlDbType.Int,4),
new SqlParameter("@PageCurrent",SqlDbType.Int,4),
new SqlParameter("@RecordCount",SqlDbType.Int,4),
new SqlParameter("@PageCount",SqlDbType.Int,4)};
parm[0].Value = PC.tbname;
parm[1].Value = PC.FieldShow;
parm[2].Value = PC.FieldKey;
parm[3].Value = PC.FieldOrder;
parm[4].Value = PC.Where;
parm[5].Value = PC.pagesize;
parm[6].Value = PC.PageCurrent;
parm[7].Direction = ParameterDirection.Output;
parm[8].Direction = ParameterDirection.Output;
pagecount =Convert.ToInt32(parm[8].Value);
recordcount = Convert.ToInt32(parm[7].Value);

return SqlHelper.ExecuteDataSet(SqlHelper.ConnectionStringLocalTransaction,CommandType.StoredProcedure,sb.ToString(),parm);
}
a285921021 2008-09-15
  • 打赏
  • 举报
回复
int pagecount;
int recordcount;
PageCut pc = new PageCut();
pc.FieldKey = "id";
pc.FieldOrder = "id desc";
pc.FieldShow = "";
pc.PageCurrent = pageno;
pc.pagesize = pagesize;
pc.Where = "";
pc.tbname = "smallclasser";
PageCurrent PC = new PageCurrent();
DataSet ds=PC.PageDs(pc, out pagecount, out recordcount);
Response.Write(pagecount+"<br>"+recordcount);
this.GridView1.DataSource = ds;
this.GridView1.DataBind(); //这是界面层调用的

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧