检查数据库中是否存在记录

Kam*_*ran 12 c# sqlcommand winforms

我正在使用这些代码行来检查记录是否存在.

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn);

int UserExist = (int)check_User_Name.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

Object reference not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)

我想要做:

if (UserExist > 0)
    // Update record

else

    // Insert record
Run Code Online (Sandbox Code Playgroud)

Son*_*nül 18

ExecuteScalar返回第一行的第一列.其他列或行将被忽略.它看起来像是第一行的第一列null,这就是NullReferenceException您尝试使用该ExecuteScalar方法时的原因.

来自MSDN ;

回报价值

结果集中第一行的第一列,如果结果集为空,则为空引用.

您可能需要COUNT在语句中使用而不是返回受影响的行数...

使用参数化查询始终是一种很好的做法.它可以防止SQL注入攻击.

并且Table是T-SQL中的保留关键字.您也应该使用方括号,[Table]也可以.

作为最终建议,请使用using声明处理您的SqlConnectionSqlCommand:

SqlCommand check_User_Name = new SqlCommand("SELECT COUNT(*) FROM [Table] WHERE ([user] = @user)" , conn);
check_User_Name.Parameters.AddWithValue("@user", txtBox_UserName.Text);
int UserExist = (int)check_User_Name.ExecuteScalar();

if(UserExist > 0)
{
   //Username exist
}
else
{
   //Username doesn't exist.
}
Run Code Online (Sandbox Code Playgroud)

  • 从数据库的角度来看,你应该使用:SELECT top 1 1 FROM [Table] WHERE([user] = @user)并检查ExecuteScalar是否为null.它的性能优于count(*) (3认同)
  • 我已经检查了文本框中int"UserExist"的值,即使记录存在,它也给我-1.我不知道这个问题是什么. (2认同)

Cem*_*mez 6

当您确实确定您的查询仅返回一个如下所示的值时,应使用 ExecuteScalar 方法:

SELECT ID FROM USERS WHERE USERNAME = 'SOMENAME'
Run Code Online (Sandbox Code Playgroud)

如果你想要整行,那么下面的代码应该更合适。

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = @user)" , conn);
check_User_Name.Parameters.AddWithValue("@user", txtBox_UserName.Text);
SqlDataReader reader = check_User_Name.ExecuteReader();
if(reader.HasRows)
{
   //User Exists
}
else
{
   //User NOT Exists
}
Run Code Online (Sandbox Code Playgroud)