【问题标题】:.Rows.Count always returns -1 even if record in database already exists?即使数据库中的记录已经存在,.Rows.Count 总是返回 -1?
【发布时间】:2020-09-27 23:58:43
【问题描述】:

基本上我想使用 c# 检查数据库中是否已经存在用户名。如果没有 - 它必须被创建。 下面是执行此操作的代码(我认为只有检查部分很重要,但无论如何我已经添加了添加部分的代码)

问题是不管它是否存在,它总是返回-1

public Boolean checkUser()
        {

            var connection = new MySqlConnection("Server=127.0.0.1;Database=book_library;user=root;password=root2");

            var table = new DataTable();

            connection.Open();

            string checkUsernameQuery = "SELECT * FROM accounts WHERE username = 'usernameInputField.Text'";

            var adapter = new MySqlDataAdapter();

            MySqlCommand command = new MySqlCommand(checkUsernameQuery, connection);

            //command.Parameters.Add("@username", MySqlDbType.VarChar).Value = usernameInputField.Text;

            adapter.SelectCommand = command;
            adapter.Fill(table);

            if (table.Rows.Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

这里是添加部分(只是添加,和问题关系不大)

 private void registerIconButton_Click(object sender, EventArgs e)
        {
            checkUser();

            var connection = new MySqlConnection("Server=127.0.0.1;Database=book_library;user=root;password=root2");

            connection.Open();

            string insertQuery = "INSERT INTO `accounts` (username, password, email) VALUES ('" + usernameInputField.Text + "','" + passwordInputField.Text + "','" + emailInputField.Text + "')";

            MySqlCommand command = new MySqlCommand(insertQuery, connection);

            command.Parameters.Add("@username", MySqlDbType.VarChar).Value = usernameInputField.Text;
            command.Parameters.Add("@password", MySqlDbType.VarChar).Value = passwordInputField.Text;
            command.Parameters.Add("@email", MySqlDbType.VarChar).Value = emailInputField.Text;

            if (checkUser())
            {
                MessageBox.Show("This username already exists!");
            }
            else
            {

                if (command.ExecuteNonQuery() == 1)
                {

                }
                else
                {
                    MessageBox.Show("ERROR");
                }
            }

            connection.Close();

        }

【问题讨论】:

  • 您需要再次检查命令参数的实际使用情况。在SELECTINSERT 查询中。
  • "SELECT * FROM accounts WHERE username = 'usernameInputField.Text'" C# 不是 php,变量名不会在字符串中扩展。顺便说一句,整个检查是不必要的。只需在用户名字段上创建一个唯一索引并在执行插入后检查约束违规错误消息。
  • 这也是一种非常奇怪的编写 SQL 的方式——你粘在控件名称中添加参数。只需使用参数。将密码存储为纯文本也会让你在现实世界中被解雇

标签: c# mysql winforms


【解决方案1】:

连接和命令是一次性的,因此您应该将它们放在 using 块中以确定性地清理资源。

如果你只是想知道是否存在某些东西,你可以使用ExecuteScalar 而不是使用重量级的适配器。

然后只需返回表达式!= null 的结果,即可获得指示用户是否存在的布尔值。

using(var connection = new MySqlConnection("Server=127.0.0.1;Database=book_library;user=root;password=root2"))
using(var cmd = connection.CreateCommand())
{
    connection.Open();

    string checkUsernameQuery = "SELECT TOP 1 username FROM accounts WHERE username = @p1";

    cmd.Parameters.Add(new MySqlParameter("@p1", MySqlDbType.VarChar).Value = usernameInputField.Text;

    var user = cmd.ExecuteScalar();

    return user != null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多