查询未按预期执行,无论如何都返回 -1

Posted

技术标签:

【中文标题】查询未按预期执行,无论如何都返回 -1【英文标题】:Query not executing as expected, returns -1 no matter what 【发布时间】:2021-06-23 12:47:16 【问题描述】:

我正在为期末考试开发用户登录系统。我在带有 ADO.NET 的 Visual Studio 中使用 C#。我在名为 Credentials 的数据库表上使用了一个查询:

SELECT * FROM Credentials WHERE Username = @Username AND Password = @Password

我也有字符串连接

Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|UserCredentials.mdf;Integrated Security=True;

然后我使用int count = selectCommand.ExecuteNonQuery(); 对表运行查询。 selectCommand 是带有上述查询的 SqlCommand 对象。无论如何,即使我输入现有的用户名和密码,计数也将等于 -1。当有人输入正确的用户名和密码组合时,我希望计数变量为 1。

class DatabaseConnection 
    public static SqlConnection GetConnection() 
        SqlConnection connection = new SqlConnection(
            "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|UserCredentials.mdf;Integrated Security=True;"
        );
        return connection;
    


class LoginDB 
    public static bool IsUser(string username, string password) 
        SqlConnection connection = DatabaseConnection.GetConnection();

        string selectStatement = @"SELECT * FROM Credentials 
                                   WHERE Username = @Username AND Password = @Password";
        SqlCommand selectCommand = new SqlCommand(selectStatement, connection);
        selectCommand.Parameters.AddWithValue("@Username", username);
        selectCommand.Parameters.AddWithValue("@Password", password);

        try 
            connection.Open();
            int count = selectCommand.ExecuteNonQuery();
            MessageBox.Show(count.ToString());
            if (count > 0) 
                return true;
            
            else 
                return false;
            
        
        catch (SqlException ex) 
            throw ex;
        
        finally 
            connection.Close();
        
    

最后在用户按下登录时的登录表单中(消息框暂时只是一个占位符):

private void btnLogin_Click(object sender, EventArgs e) 
        if (LoginDB.IsUser(txtUsername.Text, txtPassword.Text)) 
            MessageBox.Show("Logged in!");
        
    

显然这只是针对大学项目,所以不要说这显然是一种将用户登录到系统的不安全方式。

【问题讨论】:

使用Execute而不是ExecuteNonQuery,并计算你返回的记录数。 或者更改您的查询以返回计数,然后调用ExecuteScalar 我讨厌成为“那个人”,但AND Password = @Password可怕;您应该永远“按原样”存储密码 - 它们应该通过合适的单向加盐加密哈希运行(然后您对测试密码执行相同的单向哈希;哈希将匹配相同的密码,但您永远不需要存储密码)。作为一个“大学项目”,这是学习如何正确地完成它的最佳时机 :)(如果你以错误的方式练习它,那么以错误的方式做它将成为第二天性) 除@MarcGravell 非常重要的一点之外的其他说明:1。 Bad habits: Using AttachDBFileName 2. AddWithValue is Evil 3. 你应该用using 块来处理连接、命令和阅读器 4. 不要在SqlConnection 仍然打开时用消息框或复杂的计算来阻塞线程 5. @987654336 @ 所有行,甚至计数,都不是必需的,IF EXISTSCASE WHEN EXISTS 就足够了 【参考方案1】:

ExecuteNonQuery 不是您想要执行的。这是一个查询。您应该使用返回 SqlDataReader 的 ExecuteReader,然后您可以读取返回的行数。或者 ExecuteScalar 将只返回一行中的一列。

【讨论】:

就是这样!我可以发誓 ExecuteNonQuery 会起作用。谢谢! @EthanNoble ExectuteNonQuery 用于 INSERTUPDATEDELETE 更改数据的语句。它返回受更改影响的行数。 SELECT 不会更改数据,因此不会影响任何行。

以上是关于查询未按预期执行,无论如何都返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

嵌套查询未按预期工作

laravel,查询生成器,(或)查询未按预期工作

Firebase iOS 查询未按预期排序

PHP is_int 未按预期执行

Safari:媒体查询未按预期宽度触发

AccessDataSource 上的更新命令未按预期更新表