【问题标题】:MySQL Check if User exist C#MySQL 检查用户是否存在 C#
【发布时间】:2015-12-04 00:42:38
【问题描述】:

代码:

 static public void InsertUser(string userName, DataGridView DadataGridView1)
        {
            try
            {
                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                MySqlCommand check_User_Name = new MySqlCommand("SELECT * FROM IP WHERE(Username = @username)", connection);
                check_User_Name.Parameters.AddWithValue("@username", userName);
                int UserExist = (int)check_User_Name.ExecuteScalar();

                if (UserExist > 0)
                {
                    MessageBox.Show("User Exist");
                }
                else
                {
                    MySqlCommand commandInsert = new MySqlCommand("INSERT INTO IP(Username) VALUES(@Username)", connection);
                    commandInsert.Parameters.AddWithValue("@username", userName);
                    commandInsert.ExecuteNonQuery();
                    commandInsert.Parameters.Clear();
                    MessageBox.Show("User Inserted sucessfuly");
                }

            }
            catch (MySqlException exception)
            {
                MessageBox.Show(exception.ToString());

            }
            finally
            {
                connection.Close();

            }

我想检查我的数据库中的重复项,我有问题

int UserExist = (int)check_User_Name.ExecuteScalar();

System.NullReferenceException 未处理 Message=Object 引用未设置为对象的实例。

【问题讨论】:

标签: c# mysql


【解决方案1】:

使用SELECT count(*) FROM IP WHERE(Username = @username) 代替SELECT * FROM IP WHERE(Username = @username),因为.ExecuteScalar() 只能处理单个值。 * 将获取所有列值。在这种情况下你不能使用.ExecuteScalar()

所以你的代码会是这样的:

 MySqlCommand check_User_Name = new MySqlCommand("SELECT count(*) FROM IP WHERE Username = @username", connection);
                check_User_Name.Parameters.AddWithValue("@username", userName);
                int UserExist = (int)check_User_Name.ExecuteScalar();    
                if (UserExist > 0)
                {
                    MessageBox.Show("User Exist");
                } 
                else
                  {
                //execute insert here
                  }

【讨论】:

  • 好的,我的问题是我想检查所有列,我如何检查所有列的值?替换 ExecuteScalar 有什么用?
  • 为什么要检查所有列中的用户名?或者你必须检查每一行?你试过我的建议了吗?
  • 是的,我试试你的建议,它只检查第一次插入,还给出 System.NullReferenceException,我想检查所有插入。
【解决方案2】:

数据完整性是指在数据的整个生命周期内维护和确保数据的准确性和一致性,是存储、处理或检索数据的任何系统的设计、实施和使用的一个关键方面(来自 Wiki) .

因此,您应该通过在表中为该列添加唯一约束来确保数据库中的用户名是唯一的,例如:

ALTER TABLE MyUsers ADD CONSTRAINT ux_username UNIQUE (username)

这样您就可以确保无论哪个应用程序尝试插入重复的用户名都会失败,否则您数据库的每个使用者都需要执行检查以查看用户名是否未被添加。此外,您可能会遇到竞争条件,在您的检查认为用户名不存在之后,另一个进程可能同时添加了用户名,并且您的插入将添加重复记录。

所以宁愿使用数据库功能来确保数据完整性。

然后您可以执行插入并捕获异常,请参阅:UNIQUE constraint vs checking before INSERT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多