我正在尝试登录并检查用户是不是存在,但我的执行标量一直返回 null,我不知道为啥?
Posted
技术标签:
【中文标题】我正在尝试登录并检查用户是不是存在,但我的执行标量一直返回 null,我不知道为啥?【英文标题】:I am trying to login and check whether the user exist or not but my execute scalar is returning null all the time which I don't know why?我正在尝试登录并检查用户是否存在,但我的执行标量一直返回 null,我不知道为什么? 【发布时间】:2021-11-17 15:46:02 【问题描述】:我正在尝试登录,但我不明白为什么控制器会在 ExecuteScalar
处抛出错误
对象引用未设置为对象的实例
如果有人可以帮我解决这个问题,请告诉我,我们将不胜感激任何改进它的建议
这是我的 ajax 代码:
$('#login').click(function (ev)
ev.preventDefault();
FieldValidation();
var data = new Object();
data.UserName = $('#username').val();
data.UPassword = $('#userpass').val();
if (data.UserName && data.UPassword)
$.ajax(
url: 'http://localhost:1089/api/Employee/IfExist',
type: "POST",
dataType: 'json',
contentType: "application/json",
data: JSON.stringify(data),
beforeSend: function ()
$("#dvRoomsLoader").show();
,
complete: function ()
$("#dvRoomsLoader").hide();
,
success: function (data)
if (data.Role = "Admin")
window.location = "../Admin/Index";
if (data.Role = "Employee")
window.location = "../Employee/Index";
,
error: function (ex)
alert('Error' + ex.responseXML);
alert('Error' + ex.responseText);
alert('Error' + ex.responseJSON);
alert('Error' + ex.readyState);
alert('Error' + ex.statusText);
);
return false;
);
这是我在存储过程中写下的:
SELECT *
FROM Employee
WHERE UserName = @UserName AND pass = @pass
UPDATE Employee
SET IsActive = 1
WHERE UserName = @UserName AND pass = @pass
这是我在控制器中创建的要在 ajax 命中时调用的方法:
[HttpPost]
public bool IfExist(Employee emp)
var con = DB.getDatabaseConnection();
SqlCommand com = new SqlCommand("sp_CheckUserIfExists", con);
com.CommandType = CommandType.StoredProcedure;
#region If the User Exist then what to do Code Block
com.Parameters.AddWithValue("@UserName", emp.UserName);
com.Parameters.AddWithValue("@pass", emp.UPassword);
// com.ExecuteScalar();
int UserExist = (int)com.ExecuteScalar();
#endregion
if (UserExist > 0)
return true;
else
return false;
【问题讨论】:
检查参数:emp
、emp.UserName
和emp.UPassword
。其中之一是null
。
如果具有该密码的用户不存在,则存储过程返回NULL
- 然后您尝试在调用中将其转换为(int)
到ExecuteScalar
- 不检查NULL
!
旁注:您应该不为您的存储过程使用sp_
前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好直接避免 sp_
并使用其他东西作为前缀 - 或者根本不使用前缀!
我也希望您没有在数据库中存储纯文本密码;以上看起来你很可能是。
您应该对密码进行加盐和哈希处理,@SyedMuhammadAousajaAli。搜索此方法将获得大量文章、教程和文档。
【参考方案1】:
ExecuteScalar 通常用于 Select 查询,它返回 select 的第一列。所以把选择改成这个
SELECT Count(*)
FROM Employee
WHERE UserName = @UserName AND pass = @pass
....
但最好只使用你的 sp 的第二条语句
UPDATE Employee
SET IsActive = 1
WHERE UserName = @UserName AND pass = @pass
如果你使用executenonquery,它将返回受影响的行数
int rows= (int)com.ExecuteNonQuery();
bool UserExist= rows >0;
【讨论】:
以上是关于我正在尝试登录并检查用户是不是存在,但我的执行标量一直返回 null,我不知道为啥?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - 尝试构建未来的上下文以检查用户是不是已登录,但我的构建方法有错误
如何使用 useEffect 和 Context API 来检查用户是不是登录并保护路由?