Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExecuteOnQuery()始终返回-1_C#_Sql Server_Visual Studio_Executenonquery_Executescalar - Fatal编程技术网

C# ExecuteOnQuery()始终返回-1

C# ExecuteOnQuery()始终返回-1,c#,sql-server,visual-studio,executenonquery,executescalar,C#,Sql Server,Visual Studio,Executenonquery,Executescalar,我正在用C#和SQL Server创建一个登录应用程序 我的程序所做的:它查看是否可以在数据库中找到给定的用户名和密码 如果可以找到它,ExecuteNonQuery()应该返回1(找到1行) 如果组合不存在,ExecuteNonQuery()应返回其他内容 但在我的例子中,每当我使用一个好的或错误的组合,它总是返回-1。。。我该如何解决这个问题 我知道,有一些相同的问题,但它仍然没有固定的现有职位 另外,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);
        }
    }
}
这应该只是创建面向对象的任务方法的第一步。下一步是学习如何将模型与数据库代码分离

旁注:强制表计数只是为了发现条目是否存在是一种浪费。这里有一个特定的SQL语句非常有用。
搜索是否存在并阅读本文

我知道这个问题已经得到了回答。但我想为您补充一些额外信息:

ExecuteOnQuery—运行查询并返回受影响的行

ExecuteScalar-运行查询并返回第一行第一列的值

ExecuteReader-运行查询并返回SqlDataReader;可用于读取请求的数据库记录的


我最近也写了一篇关于这方面的教程,包括“内存管理”。请参阅:

您正在运行SELECT查询。ExecuteOnQuery返回运行更新/插入/删除时受影响的行数。如果要查看是否有记录,请使用ExecuteReader并检查返回的对象是否有来自msdn的行。对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。看起来更好的是,该查询应该由ExecuteScalar运行,因为您有一行一列作为结果,并使用相同的注册方法。我需要ExecuteOnQuery来查询那个。但是你建议我用另一种方法登录吗?所以我可以使用ExecuteReader?似乎您需要一个方法来针对数据库执行所有可能的任务。这几乎是不可能的。更好的方法是在类中使用特定的方法与数据库进行交互。var A=(int)cmd.ExecuteScalar();如果(a>0){Succes=true;}否则{Succes=false;}它成功了!谢谢在这里问这些“愚蠢”的问题有点尴尬……这是一样的,但是因为上面的代码在不同的类中,可能没有属性成功。