使用SqlParameter参数返回值时遇到的问题

原创 2004年09月21日 23:34:00

原来早就知道可以在调用SQL Server的存储过程,并指定参数的类型为ParameterDirection.Output来返回值,但是今天真正用起来的时候却碰到了问题,

存储过程:

CREATE procedure SqlMembership_GetAllUsers
(@ApplicationName VarChar(255),
@pagesize int,
@pageindex int,
@totalrecords int OUTPUT)
as

select @totalrecords = count(id) from SqlMembership_Users where applicationname=@applicationname

declare @indextable table(id int identity(1,1),nid int)
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select id from SqlMembership_Users where applicationname=@applicationname order by id desc
select O.* from SqlMembership_Users O,@indextable t where O.id=t.nid
and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

调用代码:

MembershipUserCollection members = new MembershipUserCollection();
   SqlDataReader dr;
   try
   {
    SqlCommand cmd = new SqlCommand("SqlMembership_GetAllUsers",conn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("@ApplicationName",SqlDbType.VarChar,255).Value = this.applicationName;
    cmd.Parameters.Add("@PageIndex",SqlDbType.Int).Value = pageIndex;
    cmd.Parameters.Add("@PageSize",SqlDbType.Int).Value = pageSize;
    SqlParameter parm = new SqlParameter("@totalrecords",SqlDbType.Int);
    parm.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(parm);

    conn.Open();
    dr = cmd.ExecuteReader();
    while( dr.Read() )
    {     
     members.Add(MembershipUserFromReader(dr));
    }
    
    if( dr != null)
    {
     dr.Close();
    }

    totalRecords = (int) parm.Value;
   }
   catch
   {
    throw;
   }
   finally
   {
    
    conn.Close();
   }
   
   return members;

 

刚开始把红色标出的那句话放在 dr.Close之前,结果一直不能得到返回的值,最后查了一下 DataReader.Close方法才恍然大悟:

MSDN:

Close 方法将填写输出参数的值、返回值和 RecordsAffected,从而增加了关闭用于处理大型或复杂的查询的 SqlDataReader 所用的时间。如果返回值和查询影响的记录的数量不重要,则可以在调用 Close 方法前调用关联的 SqlCommand 对象的 Cancel 方法,从而减少关闭 SqlDataReader 所需的时间。

看来还是实践欠缺了一点啊

SqlParameter类——带参数的SQL语句

SqlParameter 类   表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。 命名空间:  System.Data.SqlClient 程序集:...
  • woshixuye
  • woshixuye
  • 2012年01月30日 08:23
  • 13103

SqlParameter的参数应用

【方法一】 SqlParameter[] prams =//创建参数数组                               {                                ...
  • u010276845
  • u010276845
  • 2013年10月17日 11:21
  • 1183

SqlParameter参数方式操作数据库(存储过程)

DataBase.cs View Code using System; using System.Data; using System.Configuration; usi...
  • dyllove98
  • dyllove98
  • 2013年03月29日 13:43
  • 4897

SqlParameter参数化查询

SqlParameter参数化查询 2013-06-24 14:30 2999人阅读 评论(27) 收藏 举报  分类: 【.NET架构】(18)  版权声...
  • kasama1953
  • kasama1953
  • 2016年08月07日 21:17
  • 1257

如何让SqlParameter的值为null 传入SQL

cmd.parameters.add("@ID", sqldbtype.varchar).value = DBNull.Value;
  • kuui_chiu
  • kuui_chiu
  • 2013年12月31日 20:01
  • 1902

IBatis SqlParameter参数数量超过2100报错

在使用IBatis框架时,绝大多数情况下都不会出现传入参数超过限制的
  • bigheadsheep
  • bigheadsheep
  • 2014年05月14日 14:23
  • 1807

存储过程调试过程中DATETIME参数的输入故障解决方法

在对存储过程调试的时候在DATETIME参数中输入‘2005-01-01 00:00:00产生[Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值错误查询SQ...
  • pjchen
  • pjchen
  • 2005年06月18日 19:54
  • 2509

SqlParameter用法

在c#中执行sql语句时传递参数的小经验  1、直接写入法:      例如:             int Id =1;             string Name="...
  • u010552788
  • u010552788
  • 2013年12月16日 16:17
  • 586

使用activity中遇到的问题及解决办法

Activity写在前文的话,最近的项目里用到的基本上全是Activity,在使用的时候会出现很多小问题,在这里总结一下。方便以后自己掌握,同时希望也能帮助到需要帮助的人 我们都知道Activity是...
  • Good_Learning_IT
  • Good_Learning_IT
  • 2016年07月12日 21:32
  • 252

C# SQL带传入、输出参数及返回值的存储过程

/// /// 带传入参数的存储过程 /// /// /// protected void Button3_Cl...
  • o527883184
  • o527883184
  • 2016年04月17日 22:48
  • 2650
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用SqlParameter参数返回值时遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)