当前位置:编程学习 > C#/ASP.NET >>

高分求解。c# 使用ado.net 存储过程输出参数为什么总是为null。

存储过程如下。。
USE [jobswufe]
GO
/****** Object:  StoredProcedure [dbo].[JOB_PAGER]    Script Date: 10/22/2010 15:26:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[JOBPAGER] 
@startRowIndex int, 
@maxRows int,
@condition nvarchar(4000),
@recordCnt int output
AS
BEGIN
declare @v_sql nvarchar(4000)
declare @v_start int
declare @v_end int
declare @v_recordCnt int
 
set @v_start=@startRowIndex-1
set @v_end=@v_start + @maxRows-1
set @v_sql=N'SELECT @GUID=count(*) FROM (' + @condition + ') s';
exec sp_executesql @v_sql,N'@GUID int output',@recordCnt out

exec ( N'select top '+@v_end+N' * from ('+@condition+N') T where T.GUID NOT IN (select top '+@v_start+N' GUID from ('+@condition+N') b)')

END
GO


使用ado.net执行
            SqlParameter cntParam = DbHelper.CreateParameter("recordCnt", SqlDbType.Int, "", ParameterDirection.Output);
            SqlParameter[] parms = new SqlParameter[]{
                cntParam,
                DbHelper.CreateParameter("startRowIndex",SqlDbType.Int,startRowIndex),
                DbHelper.CreateParameter("maxRows",SqlDbType.Int,maxRows),
                DbHelper.CreateParameter("condition",SqlDbType.NVarChar,strSql.ToString())
                };
            using (SqlDataReader odr = DbHelper.ExecuteReader(CommandType.StoredProcedure, "dbo.JOB_PAGER", parms))
            {
                while (odr.Read())
                {
                    XXXXXInfo aInfo = new XXXXXInfo();
                    -----------------------------
                    ------------------
                    aList.Add(aInfo);
                }
            }
            recordCount = int.Parse(cntParam.Value.ToString());
            return aList;

为什么执行这句的时候int.Parse(cntParam.Value.ToString());其中cntParam.Value总是为null
然后我注释掉存储过程中的exec ( N'select top '+@v_end+N' * from ('+@condition+N') T where T.GUID NOT IN (select top '+@v_start+N' GUID from ('+@condition+N') b)') 那么返回值参数cntParam.Value的值就很正常。

求高手解答
--------------------编程问答-------------------- 哦 对不起大家 我最高只能给分83分 --------------------编程问答-------------------- 显示调用一下odr.Close()
或者是ExecuteReader()这个方法不支持返回参数,在SQLHELP中有这个问题,需要用另外的一个重载
要不就是@recordCnt没有正常赋值 --------------------编程问答-------------------- 慢慢,下断点,每步都看值。。。。 --------------------编程问答-------------------- http://topic.csdn.net/u/20100826/14/6c78a760-02a1-4e49-962f-02c7414a8fab.html --------------------编程问答-------------------- SqlParameter cntParam = DbHelper.CreateParameter("recordCnt", SqlDbType.Int, "", ParameterDirection.Output);
  SqlParameter[] parms = new SqlParameter[]{
  cntParam,
  DbHelper.CreateParameter("startRowIndex",SqlDbType.Int,startRowIndex),
  DbHelper.CreateParameter("maxRows",SqlDbType.Int,maxRows),
  DbHelper.CreateParameter("condition",SqlDbType.NVarChar,strSql.ToString())
  };
  using (SqlDataReader odr = DbHelper.ExecuteReader(CommandType.StoredProcedure, "dbo.JOB_PAGER", parms))

你建立了一个参数,一个参数数组,只传了数组。



--------------------编程问答-------------------- set @v_sql=N'SELECT @GUID=count(*) FROM (' + @condition + ') s';
这句话不对吧,
应该是set @v_sql=N'SELECT @recordCnt = count(*) FROM (' + @condition + ') s';
还有啊,你声明了@v_recordCnt 但是没见到你用到啊。 --------------------编程问答-------------------- 要不你可以将你的获取到的@recordCnt 作为下面那个select 的一个查询字段 作为一列查询出来
然后在页面可以直接用个变量取到这个值

exec ( N'select top '+@v_end+N' T.*,'+@recordCnt+N' as recordcnt from ('+@condition+N') T where T.GUID NOT IN (select top '+@v_start+N' GUID from ('+@condition+N') b)')

然后在cs代码里

int count;
while (odr.Read())
{
    count = Convert.ToInt32(odr["recordcnt"].ToString());
}
--------------------编程问答-------------------- 当   CommandType   为   StoredProcedure   时,可以使用   Command   的   Parameters   属性来访问输入及输出参数和返回值。无论调用哪一个   Execute   方法,都可以访问   Parameters   属性。但是,当调用   ExecuteReader   时,在   DataReader   关闭之前,将无法访问返回值和输出参数 
 
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,