代码:
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 引用未设置为对象的实例。
答案 0 :(得分:0)
使用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
}
答案 1 :(得分:0)
数据完整性是指在整个生命周期内维护和确保数据的准确性和一致性,并且是存储,处理或检索数据的任何系统(来自Wiki)的设计,实现和使用的关键方面
因此,您应该通过在该表的表上添加唯一约束来确保数据库中的用户名是唯一的,例如:
ALTER TABLE MyUsers ADD CONSTRAINT ux_username UNIQUE (username)
通过这种方式,您可以放心,无论哪个应用程序尝试插入重复的用户名都将失败,否则数据库的每个使用者都需要执行检查以查看是否未添加用户名。此外,您可以遇到竞争条件,在您的支票认为用户名不存在之后,另一个进程可能在此期间添加了用户名,您的插入内容将添加重复记录。
因此,请使用数据库功能来确保数据的完整性。
然后,您只需执行插入并捕获异常,请参阅:UNIQUE constraint vs checking before INSERT