当我想使用它时,sql数据读取器变空

时间:2013-03-30 17:02:24

标签: c#

我真的需要你帮助我在学校项目上工作。 我使用SqlDataReader来存储我的数据,在存储数据后(当我尝试使用sqldatareader结果视图时,我检查了它的数据)当我尝试使用sqldatareader变量时,它具有所有数据,它直接变为空? 在到达if行之前,我的sqlreader包含了所有数据,但是当我调试if行时,它显示sqlreader是空的!

 class ServicesProvider
    {
     public static SqlConnection connection = new SqlConnection(myprovider);
      public static bool LogInVerification(string NickName,string Password)
        {
            SqlDataReader SqlReader;
            SqlCommand command;
            try
            {
                command = new SqlCommand("Check_LogIn", connection);
                command.CommandType = CommandType.StoredProcedure;

            SqlParameter prm=null;
            prm = new SqlParameter("@Password", SqlDbType.VarChar);
            prm.Value=NickName;
            prm.Direction=ParameterDirection.Input;
            command.Parameters.Add(prm);

            prm = new SqlParameter("@NickName", SqlDbType.VarChar);
            prm.Value=Password;
            prm.Direction=ParameterDirection.Input;
            command.Parameters.Add(prm);

            try
            {
                connection.Open();
                SqlReader = command.ExecuteReader();

                    if (SqlReader["NickName"].ToString()== "1")
                return true;;
            }
            catch (Exception ERROR)
            {
                Console.WriteLine(ERROR.Message);
            }

        }
        catch (Exception error)
        {
            Console.WriteLine(error.Message);
        }
        return false;
    }
}

1 个答案:

答案 0 :(得分:6)

这段代码就是问题:

SqlReader = command.ExecuteReader();
if (SqlReader["NickName"].ToString()== "1")

ExecuteReader返回时,读者位于之前第一个结果。您需要致电Read来阅读结果。通常情况是:

using (SqlDataReader reader = command.ExecuteReader())
{ 
    while (reader.Read())
    {
        // Handle the data for this row
    }
}

注意:

  • 如果您只想阅读单个值,请考虑使用ExecuteScalar
  • 每个可支配资源(连接,命令,读者)都应该有一个using语句
  • 局部变量通常是camelCased(不像PascalCased,如SqlReader
  • 使用单个静态连接是一个非常糟糕的主意。创建连接并在每次要执行数据库操作时将其打开,并在完成该操作后进行处理(这将通过using语句自动进行)
  • 看起来就像您可能以纯文本格式存储密码一样。这显然是巨大的安全问题。