查询未按预期执行,无论如何都返回 -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 EXISTS
或 CASE WHEN EXISTS
就足够了
【参考方案1】:
ExecuteNonQuery 不是您想要执行的。这是一个查询。您应该使用返回 SqlDataReader 的 ExecuteReader,然后您可以读取返回的行数。或者 ExecuteScalar 将只返回一行中的一列。
【讨论】:
就是这样!我可以发誓 ExecuteNonQuery 会起作用。谢谢! @EthanNobleExectuteNonQuery
用于 INSERT
、UPDATE
和 DELETE
更改数据的语句。它返回受更改影响的行数。 SELECT
不会更改数据,因此不会影响任何行。以上是关于查询未按预期执行,无论如何都返回 -1的主要内容,如果未能解决你的问题,请参考以下文章