高分求解。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代码里
--------------------编程问答-------------------- 当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,当调用 ExecuteReader 时,在 DataReader 关闭之前,将无法访问返回值和输出参数
int count;
while (odr.Read())
{
count = Convert.ToInt32(odr["recordcnt"].ToString());
}
补充:.NET技术 , ASP.NET