0
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;
  }

I wrote the code in my data access layer but it was giving error on rows to count the columns.

Error:

'System.Data.SqlClient.SqlDataReader' does not contain a definition for 'Rows' and no extension method 'Rows' accepting a first argument of type 'System.Data.SqlClient.SqlDataReader' could be found (are you missing a using directive or an assembly reference?)

4

3 回答 3

3

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

if (dr.HasRows) 
{
    return true;
}

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

DataTable dt = new DataTable();
dt.Load(dr);
int num = dt.Rows.Count;
于 2013-09-06T15:16:21.890 回答
2

SqlDataReader 没有 Rows 属性。

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

于 2013-09-06T15:15:03.690 回答
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)
        }
    }
  • 连接对象不再是全局的,它在 using 语句的关闭时被销毁。
  • 无需使用 DataReader 来确定用户是否存在
  • 使用参数化查询来避免对输入数据的 SQL 注入

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

于 2013-09-06T15:20:27.253 回答