使用SqlParameter参数返回值时遇到的问题
2004-09-21 23:34
483 查看
原来早就知道可以在调用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 所需的时间。
看来还是实践欠缺了一点啊
存储过程:
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 所需的时间。
看来还是实践欠缺了一点啊
相关文章推荐
- 函数返回值为指针的一个陷阱(使用inet_ntoa函数时遇到的问题)
- 在MIDAS中使用SocketConnection遇到的问题
- 使用vs.net遇到的问题
- 使用Wallop 遇到的问题
- 使用VC6调用DLL出现的问题(使用LoadLibrary返回值为0)
- 使用最新的cvs及cvsweb,遇到的问题解决办法。
- 今天开始使用这个blog来记录我的学习中遇到的问题吧
- 在IIS 6 中使用HTTP压缩(Compression)遇到的一个问题
- VC6使用过程中遇到的问题收集(1) zz
- 使用System.IO.StreamReader时遇到的问题 (转)
- 使用Oracle中fileopen命令加载文件时遇到的怪问题
- 关于您提到使用WebServices时候遇到“基础连接以关闭”的问题
- 使用WebServices时候遇到“基础连接以关闭”的问题
- datagrid中使用dropdownlist编辑模版时遇到问题
- SimpleDateFormt 使用中遇到的一个小问题
- 在nhibernate使用过程中遇到的几个问题。
- updater application block v2.0的使用过程中遇到的问题及解决办法
- 在使用BizTalk时遇到一个很郁闷的问题
- 使用Access存储Session,遇到了SessionId问题?
- 遇到 Web Server 中不能使用 XmlSerializer 的问题