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声明处理您的SqlConnection和SqlCommand:
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)
当您确实确定您的查询仅返回一个如下所示的值时,应使用 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)