我的第一篇博客,前两天在写验证用户登录时,遇到了一个DBNull异常。在网上查了一下,原来是在数据库中空操作引起的异常,于是找到了一篇文章跟我的问题差不多
这是我的第一篇博客,前两天在写验证用户登录时,遇到了一个DBNull异常。在网上查了一下,原来是在数据库中空操作引起的异常,于是找到了一篇文章跟我的问题差不多
文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/200855/113099.html
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
后台代码
public string Login(string ManagerName, string ManagerPassword)
{
SqlConnection myConnection = con.GetSqlConnection();
SqlCommand myCommand = new SqlCommand("ManangerLogin", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parameterManagerName = new SqlParameter("@ManagerName",SqlDbType.NVarChar,50);
parameterManagerName.Value = ManagerName;
myCommand.Parameters.Add(parameterManagerName);
SqlParameter parameterManagerPassword = new SqlParameter("@ManagerPassword",SqlDbType.NVarChar,50);
parameterManagerPassword.Value=ManagerPassword;
myCommand.Parameters.Add(parameterManagerPassword);
SqlParameter parameterManagerID = new SqlParameter("@ManagerID", SqlDbType.Int, 4);
parameterManagerID.Direction = ParameterDirection.Output;
myCommand.Parameters.Add(parameterManagerID);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
int managerId = Convert.ToInt16(parameterManagerID.Value);//运行到这里时出错!
if (managerId == 0)
{
return null;
}
else
{
return managerId.ToString();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
存储过程
alter PROCEDURE ManangerLogin
(
@ManagerName nvarchar(50),
@ManagerPassword nvarchar(50),
@ManagerID int output
)
AS
BEGIN
select @ManagerID=ManagerID
from Manager
where ManagerName=@ManagerName and ManagerPassword=@ManagerPassword
if @@RowCount<0 //(我本人认为这个地方是错误的,应为@@RowCount=0,请高手指教 )
select
@ManagerID=0
END
GO
原因:parameterManagerID.Value返回的值是 DBNull,也就是说相当于数据库单元格中什么值也没有,事先判断这种情况
代码改为:
if (Convert.IsDBNull(parameterManagerID.Value))//对返回dbnull进行判断
{
return null;
}
else
{
int managerId = (int)(parameterManagerID.Value);
if (managerId == 0)
{
return null;
}
else
{
return managerId.ToString();
}
}