先看下面的一小段存储过程:
ALTER procedure [dbo].[StuInfo_GetStuInfo_CardID]
@CardID varchar(20) , @Available varchar(20),@intCountCardID intoutput
as
begin
select @intCountCardID= count(CardID) from StudentInfo where CardID=@CardID andAvailable=@Available
end
起初我在数据访问层的方法中用的Datareader来获取存储过程中的输出参数,因为对datareader不熟悉,调试了很长时间,程序本身并不抛出异常,但是无法获取数据表中的数据,上网查了不少资料,最开始以为是datareader的连接关闭问题,修改后依然不行;继续查资料,看到有人说datareader读取的数据默认位置是第一条记录之前,然后通过reader方法读取数据,但是依然没有读到数据。
迫于无奈将存储过程做了一下修改,去掉了输出参数:
select count(CardID) from StudentInfo where CardID=@CardID and Available=@Available
经过这样修改之后可以正常运行,仔细分析了一下问题应该出在存储过程的输出参数和datareader的读取数据的数据类型对象上。
在存储过程中,指明的输出类型是一个整型数据,而不是从数据库表中直接读取,或者经过查询语句得到的临时的表数据,而datareader支持的数据源对象是基于数据库的相关的数据类型,因此,始终无法获取数据。
我们可以在数据访问层加上一句话来验证在vb.net的数据访问层指定的对应存储过程的输出变量(sqlParamIntCountCardID)已经获得了数据。
MsgBox(sqlParamIntCountCardID.Value.ToString)
调试这段程序用了很长时间,不过总算是有收获,从这次犯得错误中明白了datareader对象和存储过程的输出参数这两种程序元素的使用规则,从更深一个层次上明白了,学习看本质的重要性!我觉得写程序是一个锻炼我们思维严密性的一个过程,编写程序是一件锻炼人的事儿,在学习程序之初,更多的是锻炼和提升,到了后期就是一种享受了,我想这也就是程序员的快乐之一吧!