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