ExecuteNonQuery() 总是返回 -1
ExecuteNonQuery() always returning -1
我正在使用 C# 和 SQL 服务器创建登录应用程序。
我的程序的作用:查看是否可以在数据库中找到给定的用户名和密码。
如果可以找到,ExecuteNonQuery()
应该 return 1(找到 1 行)。
如果组合不存在,ExecuteNonQuery()
应该 return 其他。
但就我而言,每当我使用好的或错误的组合时,它总是 returns -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");
}
}
这是我的 class:
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();
}
}
您似乎想要一个方法来对数据库执行所有可能的任务。这几乎是不可能的。更好的方法是在 class 中使用特定方法与数据库进行交互
例如,您可以更改 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);
}
}
}
这应该只是为您的任务创建 OOP 方法的第一步。接下来是学习如何将模型与数据库代码分开。
旁注:强制计算 table 只是为了发现条目是否存在是一种浪费。有一个特定的 SQL 语句在这里有很大帮助。
搜索 IF EXISTS 并阅读这篇文章
Exists vs Count The battle never ends
我知道这个问题已经得到解答。但我想为您添加一些额外的信息:
ExecuteNonQuery - 运行查询和 returns 受影响的行。
ExecuteScalar - 运行查询并returns第一行第一列的值。
ExecuteReader - 运行查询和 returns SqlDataReader;可用于读取请求的数据库记录
我最近也写了一个教程,包括"memory management"。请参阅:http://jeroenstevens.blogspot.ca/2017/02/how-to-connect-netc-to-sql-database.html
我正在使用 C# 和 SQL 服务器创建登录应用程序。
我的程序的作用:查看是否可以在数据库中找到给定的用户名和密码。
如果可以找到,ExecuteNonQuery()
应该 return 1(找到 1 行)。
如果组合不存在,ExecuteNonQuery()
应该 return 其他。
但就我而言,每当我使用好的或错误的组合时,它总是 returns -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");
}
}
这是我的 class:
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();
}
}
您似乎想要一个方法来对数据库执行所有可能的任务。这几乎是不可能的。更好的方法是在 class 中使用特定方法与数据库进行交互
例如,您可以更改 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);
}
}
}
这应该只是为您的任务创建 OOP 方法的第一步。接下来是学习如何将模型与数据库代码分开。
旁注:强制计算 table 只是为了发现条目是否存在是一种浪费。有一个特定的 SQL 语句在这里有很大帮助。
搜索 IF EXISTS 并阅读这篇文章
Exists vs Count The battle never ends
我知道这个问题已经得到解答。但我想为您添加一些额外的信息:
ExecuteNonQuery - 运行查询和 returns 受影响的行。
ExecuteScalar - 运行查询并returns第一行第一列的值。
ExecuteReader - 运行查询和 returns SqlDataReader;可用于读取请求的数据库记录
我最近也写了一个教程,包括"memory management"。请参阅:http://jeroenstevens.blogspot.ca/2017/02/how-to-connect-netc-to-sql-database.html