c# - ExecuteNonQuery() 总是返回 -1

标签 c# sql-server visual-studio executenonquery executescalar

我正在使用 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();
    }
}

最佳答案

您似乎需要一个方法来针对数据库执行所有可能的任务。这实际上是不可能的。更好的方法是在类中使用特定的方法来与数据库进行交互

例如,您可以更改您的 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 方法的第一步。接下来是学习如何将模型与数据库代码分开。

旁注:强制对表进行计数只是为了发现条目是否存在是一种浪费。有一个特定的 SQL 语句在这里很有帮助。
搜索 IF EXISTS 并阅读本文
Exists vs Count The battle never ends

关于c# - ExecuteNonQuery() 总是返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41515955/

相关文章:

sql - 将多个语句之间传递给存储过程

c# - 通过网络请求传输图像

sql - 优化查询以获取最小值/最大值

sql - 在 SQL 中设置可变日期

c++ - 在 VS2010 中动态链接 Boost 1.51.0 时链接器错误 LNK2019

c# - VS 2013 中的 "This feature is only available for view with a strongly typed model",ASP,C#

c++ - Visual Studio 2013 CTP 是否支持非整数类型的类内静态常量初始值设定项?

c# - 用于切换 "Show hidden files, folders and drives"的 API

c# - 无法在 LinQ 查询中将类型 'bool?' 隐式转换为 'bool'?

c# - 如何在 Linux 上获取 CPU 温度