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

2016-01-29 13:12 59 1 收藏

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

【 tulaoshi.com - ASP.NET 】


原来早就知道可以在调用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 所需的时间。看来还是实践欠缺了一点啊

来源:https://www.tulaoshi.com/n/20160129/1489301.html

延伸阅读
标签: Web开发
最近做个练习,用到Array.slice()和Array.splice(),以前没有注意其返回值类型 Array.slice()返回Array -- 一个由原始数组中某一范围的元素构成的数组。 Array.splice()返回Array -- 包含从原始数组中删除的元素的一个数组。 返回的是一个数组,用typeof()看一下是object,这没错!需要提醒大家的是: 当数组元素是数字时,用A...
项目DALFactory是采用工厂模式设计的,设计模式的书我也曾看过java的设计模式,理解也不太深刻,但对工厂模式还是较为熟悉,使用它可以根据需求返回不同的实例对象,在DALFactory项目中使用反射机制来实现依赖注入,当然,它的实现还是没有java中的spring那样灵活,强大,部分代码如下: // <summary> /// 抽象工厂模式创建DAL。 /// web.co...
标签: Web开发
如果有一大串变量值通过ajax从别的文件那里得到然后分别赋给js里面的很多变量,有什么好办法? 将PHP文件里面的返回值传到js的两个变量中去, 得到的js文件里面两个变量分别为 bo_count=3 和 hd_count=3 PHP code?PHP //生成json串,这个你可以考虑PHP自带的json_encode函数,也可以google个开源的PHP json类 $return =  ""; ? sc...
标签: 相亲 女生
相亲男方目的性太强 相亲的目的本来就是为了结婚。难道是为了出来多认识朋友?大家嘴巴上说的是,相亲就当认识朋友,不成夫妻的话。也可以成为普通朋友。那么现在你回想下自己。你和以前相亲对象现在还是普通朋友的?又有几个还在继续联系的?突然有一天。你发现你男朋友和以前相亲还在微信或QQ聊天。然后他告诉你,那个是普通朋友,你信吗...
标签: Delphi
  有关 Delphi 传入应用程式的命令列参数, 请参考以下的说明: 用ParamCount函数取得命令参数的个数: 呼叫 ParamStr(0), 传回执行档的档名(含路径) 呼叫 ParamStr(n), 传回第n个参数的内容 procedure TForm1.FormCreate(Sender: TObject); var sFileName: string; begin if ParamCount 0 then begin (* 有执行参数传入 *) sFileNam...

经验教程

864

收藏

30
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部