超奇怪问题,存储过程出数问题!!怪怪!!!!!

KJ_Wang 2006-11-02 12:13:44
本人测试一个分页问题,但输出的值写到Web上时,出现这种怪异常现象。晕!
System.NullReferenceException: 未将对象引用设置到对象的实例。

采用SQL Server中示例数据库Northwind
存储过程如下:
if exists(select * from sysobjects where id=object_id('dbo.Usp_CustomersList'))
begin
drop procedure Usp_CustomersList
end

go

create procedure Usp_CustomersList
@PageRequest int,
@TotalPages int output

as
set nocount on

if((select count(*) from customers)=0)
begin
select @TotalPages=0
select @PageRequest=0
return 0
end
else
begin
select @TotalPages=ceiling(count(*)/9) from customers
end

if(@PageRequest<=1)
begin
select top 9 * from customers order by CustomerID
set @PageRequest=1
-- select @TotalPages=1
return 0
end

else


if(@PageRequest>@TotalPages)
set @PageRequest=@TotalPages

declare @RowCount int

set @RowCount=(@PageRequest*9)

exec('select * from
(select top 9 a.* from
(select top '+@RowCount+'* from customers order by
customerid) a
order by customerid desc) b
order by customerid')

return 0


输出的参数值如下:
private void databinder(int requestpage)
{
SqlConnection con = new SqlConnection("data source=mypc;initial catalog=northwind;user id=sa;password=weblogic");
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "Usp_CustomersList";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@PageRequest", SqlDbType.Int);
cmd.Parameters.Add("@TotalPages", SqlDbType.Int);
cmd.Parameters[0].Value = requestpage;
cmd.Parameters[0].Direction=ParameterDirection.Input;
cmd.Parameters[1].Direction=ParameterDirection.Output;

SqlDataReader sdr=cmd.ExecuteReader();
DataList1.DataSource=sdr;
DataList1.DataBind();
txtTotalPages.Text = cmd.Parameters[1].Value.ToString();

}

出错位置如下语句:
txtTotalPages.Text = cmd.Parameters[1].Value.ToString();
本人用了直接写SqlParameter来写的参数还是有这问题,这样写也有问题,用Win Form来写也有问题,在DOS下Console来写也有问题,但在Visual Basic 6下写没问题,原因何在?

麻烦大家指点指点!

还有C#中用数据绑定,不同时间出来不同的结果,而有时则没有DataBind();有时有,为什么?很是晕!
...全文
143 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
alvachien 2006-11-02
  • 打赏
  • 举报
回复
看看MSDN的这个示例:
public void CreateMySqlCommand(SqlConnection myConnection,
string mySelectQuery, SqlParameter[] myParamArray) {
SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection);
myCommand.CommandText = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = @Country AND City = @City";
myCommand.Parameters.Add(myParamArray);
for (int j=0; j<myParamArray.Length; j++)
{
myCommand.Parameters.Add(myParamArray[j]) ;
}
string myMessage = "";
for (int i = 0; i < myCommand.Parameters.Count; i++)
{
myMessage += myCommand.Parameters[i].ToString() + "\n";
}
MessageBox.Show(myMessage);
}
KJ_Wang 2006-11-02
  • 打赏
  • 举报
回复
跟踪调试,结出的结果是null值,但SQL调试出来的结果不是null值。
KJ_Wang 2006-11-02
  • 打赏
  • 举报
回复
这句放到DataBind那句上面试试。也不行!
KJ_Wang 2006-11-02
  • 打赏
  • 举报
回复
SQL调试
declare @requestpages int
declare @totalpages int

select @requestpages=1;

exec Usp_CustomersList @requestpages,@totalpages output

select @totalpages

结果:
第一、出一组查询结果
第二、10页
贝贝壳壳 2006-11-02
  • 打赏
  • 举报
回复
这句放到DataBind那句上面试试。
alvachien 2006-11-02
  • 打赏
  • 举报
回复
确认Cmd非null
确认cmd.Parameter[1]非null
确认cmd.Parameter[1].Value非null

另外,如果使用SQL Server 2005,你的存储过程可以简化为
if object_id('dbo.Usp_CustomersList') not null
begin
drop procedure Usp_CustomersList
end
brucenan999 2006-11-02
  • 打赏
  • 举报
回复
是不是totalpage的值没有返回,你在SQL里单独调试一下存储过程,看看有没有问题.
KJ_Wang 2006-11-02
  • 打赏
  • 举报
回复
txtTotalPages.Text = cmd.Parameters[1].Value.ToString();
贝贝壳壳 2006-11-02
  • 打赏
  • 举报
回复
标出异常出在哪一句上。

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧