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