ExecuteNonQuery()始终返回-1

时间:2017-01-06 23:21:42

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

我正在使用C#和SQL Server创建登录应用程序。

我的程序做了什么:查看是否可以在数据库中找到给定的用户名和密码。

如果可以找到,<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p>Click to toggle</p> <div class="on"> <span class="n">On</span> <span class="f">Off</span> </div>应该返回1(找到1行)。

如果组合不存在,ExecuteNonQuery()应返回其他内容。

但在我的情况下,每当我使用好的或错误的组合时,它总是返回-1 ...我该如何解决这个问题?

我知道,同一个问题有一些现有的帖子,但它仍然没有修复......

另外,ExecuteNonQuery()和&amp;之间有什么区别? 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");
    }
}

2 个答案:

答案 0 :(得分:1)

您似乎希望使用单个方法针对数据库执行每项可能的任务。这实际上是不可能的。更好的方法是在类中使用与数据库进行交互的特定方法

例如,您可以更改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

答案 1 :(得分:0)

我知道这些问题已得到解答。但我想为您添加一些其他信息:

ExecuteNonQuery - 运行查询并返回受影响的行。

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

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

我最近也写了一篇关于这个的教程,包括“内存管理”。请参阅:http://jeroenstevens.blogspot.ca/2017/02/how-to-connect-netc-to-sql-database.html