SqlDataReader中缺少Rows属性

时间:2013-09-06 15:10:17

标签: c# sql sql-server

public bool ValidateUser(string uName)
{
  SqlCommand cmd = new SqlCommand();
  if (connection == null)
  {
    connection = connectToDB();
  }
  cmd.Connection = connection;
  cmd.CommandText = "Select * from Users where UserName='" + uName + "'";
  cmd.CommandType = CommandType.Text;
  SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  if (dr.Rows.Count > 0) 
  {
    return true;
  }
  else
  {
    return false;
  }

我在我的数据访问层中编写了代码,但它在行上给出错误来计算列数。

错误:

  

'System.Data.SqlClient.SqlDataReader'不包含'Rows'的定义,也没有扩展方法'Rows'接受类型为'System.Data.SqlClient.SqlDataReader'的第一个参数'(你丢失了吗?) using指令或程序集引用?)

3 个答案:

答案 0 :(得分:3)

请使用HasRows,因为SqlDataReader没有属性调用Rows

if (dr.HasRows) 
{
    return true;
}

但是,如果您想要计数,则可以将其加载到数据表中

DataTable dt = new DataTable();
dt.Load(dr);
int num = dt.Rows.Count;

答案 1 :(得分:2)

SqlDataReader没有Rows属性。

也许考虑SqlDataReader的HasRows属性 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.hasrows.aspx

答案 2 :(得分:1)

SqlDataReader中没有Rows属性 但是你的代码有很多问题 我会以这种方式更改您的代码:

    public bool ValidateUser(string uName)
    {
        using(SqlConnection cn = connectToDB())
        using(SqlCommand cmd = new SqlCommand("Select count(*) from Users where UserName=@name", cn))
        {
           cmd.Parameters.AddWithValue("@name", uName);
           return (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
        }
    }
  • 连接对象不再是全局的,并且在其中被销毁 关闭使用声明。
  • 无需仅使用DataReader来查明用户是否存在或 不
  • 使用参数化查询来避免输入数据上的SQL注入

避免使用全局连接对象。有connection pooling基础结构可以消除任何性能问题,并且您可以避免过多的资源使用 当您需要按顺序检索大量记录时,SqlDataReader是一个不错的选择,但是如果用户存在,则只获取信息,最好的方法是通过ExecuteScalar方法和适当的sql。 参数化查询是每个严肃的数据库工作必须的。它会将您的输入格式化为框架,并且不会冒Sql Injection

的风险