我有一个存储过程,用于在登录期间验证用户。 如果成功则返回用户实体,并且效果很好!我的问题是,如果它不起作用,我会在SP中引发错误,如何捕获此错误并以最佳方式使用它?现在我得到nullrefference,这是代码: 存储过程:
ALTER PROCEDURE getEmployee
(
@username nvarchar(50),
@password nvarchar(50)
)
AS
DECLARE @Error_MSG nvarchar(50)
BEGIN
IF EXISTS (select * from Employee where eUsername = @username AND pword = @password)
begin
select * from Employee where eUsername = @username AND pword = @password
END
ELSE
BEGIN
SET @Error_MSG = 'Wrong password, or user doesnt exist'
RAISERROR (@Error_MSG, 11,1)
END
END
在代码中看起来像这样,SP就是getEmployee
ActivityDatabaseDataContext dc = new ActivityDatabaseDataContext();
Employee emp;
public bool logIn(string piUsername, string piPassword)
{
try
{
emp = dc.getEmployee(piUsername, piPassword).Single();
}
catch (Exception ex)
{
errorMsg = ex.Message + ex.InnerException.Message;
}
if (emp != null)
{
AppHelper.AppHelper.setUser(emp);
return true;
}
else
{
return false;
}
我的问题是我应该如何处理异常?
答案 0 :(得分:4)
我通常不会从SP引发错误,除非它实际上是操作的系统问题。输入错误的用户名和密码是一个用户问题,你只需要在接口级别进行处理,所以我将大部分SP丢弃并处理两个用例(返回1行或0行)业务层或接口代码。如果为0行,则向客户端发送“用户名或密码错误”消息,如果为1,则登录。
ALTER PROCEDURE getEmployee
(
@username nvarchar(50),
@password nvarchar(50)
)
AS
BEGIN
select * from Employee where eUsername = @username AND pword = @password
END
答案 1 :(得分:1)
您的InnerException可能为null。
您应该尝试捕获并处理特定的异常,在本例中为SqlExceptions。
答案 2 :(得分:1)
ALTER PROCEDURE getEmployee
(
@username nvarchar(50),
@password nvarchar(50)
)
AS
BEGIN
select * from Employee where eUsername = @username AND pword = @password
END
...
SqlCommand cmd = new SqlCommand("getEmployee", conn);
cmd.AddWithValue('@username', name);
cmd.AddWithValue('@password', pass);
SqlAdapter da = new SqlAdapter(cmd);
DataSet ds= new DataSet();
da.Fill(ds);
if (ds.Table.Count > 0 && ds.Table.Rows.Count == 1) {
// success
} else {
// fail
}
答案 3 :(得分:1)
IF(@Count>0)
BEGIN
SELECT @RetVal = 6
, @ErrMsg = 'A description with the same name exists. Please provide a unique name.'
GOTO ERROR
END
在catch中使用内置的StoredProcException,这意味着:
catch (StoredProcException spEx)
{
switch (spEx.ReturnValue)
{
case 6:
UserMessageException umEx= new UserMessageException(spEx.Message);
throw umEx;
}
}
您可以将消息作为字符串而不是spEx.Message
传递