【问题标题】:Check duplicate username with parameterized query使用参数化查询检查重复的用户名
【发布时间】:2013-03-11 10:14:08
【问题描述】:

我想检查数据库中是否已经存在用户名。

SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["DBCOnn"].ToString());
try
{
    con.Open();

   SqlCommand cmd = new SqlCommand("select client_id from tbl_client where client_name=@cname", con);
   cmd.CommandType = CommandType.Text;

   cmd.Parameters.Add("@cname", DbType.String).Value = usernm;

   int i = cmd.ExecuteNonQuery();
   if (i > 0)
       return true;
   else
       return false;
}
catch (Exception ex)
{
    throw new Exception("CheckExistingClient:" + ex.Message, ex.InnerException);
}
finally
{
    con.Close();
}

但在这里,i 总是以-1 的形式给予

有什么问题?

【问题讨论】:

    标签: c# asp.net tsql ado.net


    【解决方案1】:

    ExecuteNonQuery 返回受影响的行数,通常用于插入、更新或删除语句。请改用ExecuteScalarCOUNT

    using (var con = new SqlConnection(ConfigurationManager.AppSettings["DBCOnn"].ToString()))
    using(var cmd = new SqlCommand("select COUNT(client_id) from tbl_client where client_name=@cname", con))
    {
        cmd.Parameters.Add("@cname", DbType.String).Value = usernm;
        con.Open();
        int i = (int)cmd.ExecuteScalar();
        return i > 0;
    }
    

    这是关于 SO 的相关答案:https://stackoverflow.com/a/4269651/284240

    【讨论】:

      【解决方案2】:

      ExecuteNonQuery 返回受 INSERT、UPDATE 或 DELETE 语句影响的行数。您正在运行 SELECT。

      我发现“从 UserName=@cName 的用户中选择”并运行标准选择更容易。

      【讨论】:

        【解决方案3】:

        ExecuteNonQuery 用于 DML 查询。您没有修改和行。所以你得到的结果是-1。

        你可以使用select count(client_id) from tbl_client where client_name=@cname

        然后使用cmd.ExecuteScalar 获取计数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 2011-01-26
          相关资源
          最近更新 更多