查询未按预期执行,returns -1 无论如何
Query not executing as expected, returns -1 no matter what
我正在为学期期末开发用户登录系统。我在 Visual Studio 和 ADO.NET 中使用 C#。我有一个在名为 Credentials:
的数据库 table 上使用的查询
SELECT * FROM Credentials WHERE Username = @Username AND Password = @Password
我也有字符串连接
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|UserCredentials.mdf;Integrated Security=True;
然后我 运行 对 table 和 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!");
}
}
显然这只是一个大学项目,所以不要说这显然是一种将用户登录到系统的不安全方式。
ExecuteNonQuery 不是您要执行的。这是一个查询。您应该使用 return 一个 SqlDataReader 的 ExecuteReader,然后您可以读取 returned 了多少行。或者 ExecuteScalar 将 return 只有一行的一列。
我正在为学期期末开发用户登录系统。我在 Visual Studio 和 ADO.NET 中使用 C#。我有一个在名为 Credentials:
的数据库 table 上使用的查询SELECT * FROM Credentials WHERE Username = @Username AND Password = @Password
我也有字符串连接
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|UserCredentials.mdf;Integrated Security=True;
然后我 运行 对 table 和 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!");
}
}
显然这只是一个大学项目,所以不要说这显然是一种将用户登录到系统的不安全方式。
ExecuteNonQuery 不是您要执行的。这是一个查询。您应该使用 return 一个 SqlDataReader 的 ExecuteReader,然后您可以读取 returned 了多少行。或者 ExecuteScalar 将 return 只有一行的一列。