ExecuteNonQuery() всегда возвращает -1
Я создаю приложение для входа в систему с C# и SQL Server.
Что делает моя программа: она ищет, можно ли найти имя пользователя и пароль в базе данных.
Если это можно найти, ExecuteNonQuery()
должен вернуть 1 (1 строка найдена).
Если комбинация не существует, ExecuteNonQuery()
должен вернуть что-то еще.
Но в моем случае, когда я использую хорошую или неправильную комбинацию, она всегда возвращает -1... как мне это исправить?
Я знаю, есть некоторые существующие посты по тому же вопросу, но это все еще не исправлено...
Кроме того, в чем разница между ExecuteNonQuery()
& ExecuteScalar()
?
Это отправляемый запрос:
private void btn_loginvolgende_Click(object sender, EventArgs e)
{
gebruiker.Gebruikersnaam = Convert.ToString(tb_gebruikersnaamlogin.Text);
gebruiker.Wachtwoord = Convert.ToString(tb_wachtwoordlogin.Text);
gebruiker.Achternaam = "a";
gebruiker.Geslacht = "a";
gebruiker.Geslacht = "a";
gebruiker.Huidiggewicht = 1;
gebruiker.Streefgewicht = 1;
gebruiker.Leeftijd = 1;
gebruiker.Naam = "a";
db.QueryToDatabase("Select count (*) from Gebruiker where Wachtwoord = @Wachtwoord AND Gebruikersnaam = @Gebruikersnaam;", gebruiker);
Thread.Sleep(500);
if (db.Success == false)
{
MessageBox.Show("Login gegevens kloppen niet!");
}
else if (db.Success == true)
{
MessageBox.Show("U bent met succes ingelogd");
}
}
а это мой класс
public void QueryToDatabase(string commandText, Gebruikerklasse gebruiker)
{
// nieuwe connectie maken
// ontvangt de query vanuit 'buttonclick' en voert hem hier uit
// als ExecuteNonQuery niet kan worden uitgevoerd is er iets fout gegaan. D.m.v een bool moet hij dan een bericht tonen
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
conn.Open();
cmd.Parameters.AddWithValue("@Naam", gebruiker.Naam);
cmd.Parameters.AddWithValue("@Achternaam", gebruiker.Achternaam);
cmd.Parameters.AddWithValue("@Leeftijd", gebruiker.Leeftijd);
cmd.Parameters.AddWithValue("@Geslacht", gebruiker.Geslacht);
cmd.Parameters.AddWithValue("@Huidiggewicht", gebruiker.Huidiggewicht);
cmd.Parameters.AddWithValue("@Streefgewicht", gebruiker.Streefgewicht);
cmd.Parameters.AddWithValue("@Gebruikersnaam", gebruiker.Gebruikersnaam);
cmd.Parameters.AddWithValue("@Wachtwoord", gebruiker.Wachtwoord);
int a = cmd.ExecuteNonQuery();
if (a == 1)
{
Success = true;
}
else if (a == -1)
{
Success = false;
}
conn.Close();
}
}
2 ответа
Кажется, что вы хотите, чтобы один метод выполнял все возможные задачи с базой данных. Это практически невозможно. Лучше подходить к тому, чтобы в вашем классе были специальные методы, взаимодействующие с базой данных.
Например, вы можете изменить свой Gebruikerklasse
и добавить метод с именем Exists
где вы можете точно настроить взаимодействие для конкретной задачи. Не нужно создавать много параметров, когда вам нужно только два. Используйте более производительный (и правильный) вызов ExecuteScalar, чтобы вернуть информацию из хранилища и т. Д.
public class Gebruikerklasse
{
....
public bool Exists()
{
string commandText = @"Select count (*) from Gebruiker
where Wachtwoord = @Wachtwoord AND
Gebruikersnaam = @Gebruikersnaam;",
using (SqlConnection conn = new SqlConnection(DBClass.GetConnectionString()))
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
conn.Open();
cmd.Parameters.AddWithValue("@Gebruikersnaam", gebruiker.Gebruikersnaam);
cmd.Parameters.AddWithValue("@Wachtwoord", gebruiker.Wachtwoord);
int a = Convert.ToInt32(cmd.ExecuteScalar());
return (a > 0);
}
}
}
Это должно быть только первым шагом в создании ООП подхода к вашим задачам. Далее следует узнать, как отделить вашу модель от кода базы данных.
Примечание: принудительное подсчет таблицы просто для того, чтобы узнать, существует запись или нет, является пустой тратой. Здесь есть конкретный оператор SQL, который очень помогает.
Ищите ЕСЛИ СУЩЕСТВУЕТ и читайте эту статью
Существует против графа Битва никогда не заканчивается
Я знаю, что на эти вопросы ответили. Но я хотел бы добавить дополнительную информацию для вас:
ExecuteNonQuery - запускает запрос и возвращает затронутые строки.
ExecuteScalar - запускает запрос и возвращает значение первого столбца первой строки.
ExecuteReader - запускает запрос и возвращает SqlDataReader; которые могут быть использованы для чтения запрошенных записей базы данных
Я недавно написал учебник по этому вопросу, в том числе "Управление памятью". Пожалуйста, смотрите: http://jeroenstevens.blogspot.ca/2017/02/how-to-connect-netc-to-sql-database.html