我正在尝试登录并检查用户是不是存在,但我的执行标量一直返回 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;
    

【问题讨论】:

检查参数:empemp.UserNameemp.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 - 尝试构建未来的上下文以检查用户是不是已登录,但我的构建方法有错误

检查会话是不是存在 JSF

如何使用 useEffect 和 Context API 来检查用户是不是登录并保护路由?

Firebase Facebook登录检查用户是不是存在

我正在尝试检查电子邮件是不是已存在于数据库中或不在数据库中,但我的代码会引发错误

如何检查用户是不是在 php 中登录?