ASP.NET не может выбрать и обновить

protected void btnLogin_Click(object sender, EventArgs e)
{

    SqlConnection conn = new SqlConnection("Data Source=MCDU11;Initial Catalog=VisitorManagement;Integrated Security=True");

    SqlCommand cmd = new SqlCommand("SELECT * FROM SecurityUser WHERE Username = '" + txtUsername.Text.Trim() + "' AND "
                                        + "Password='" + Encrypt(txtPassword.Text.Trim()) + "'" , conn);

    SqlCommand cmd1 = new SqlCommand("update SecurityUser set LoginOn ='" + DateTime.Now + "' , " + "WHERE Username ='" + txtUsername.Text.Trim() + "'", conn);
    conn.Open();

    SqlDataReader dr;

    dr = cmd.ExecuteReader();


    if (dr.Read())
    {

        Session["Username"] = txtUsername.Text;
        Session["Id"] = dr["Id"].ToString();
        cmd1.ExecuteNonQuery();
        Response.Redirect("SecurityHome.aspx");

    }
    else
    {
        lblError.Text = "Either username and/or password is wrong. Please try again!";
    }

    dr.Close();
    conn.Close();


}

это моя ошибка

«Исключение типа 'System.InvalidOperationException' произошло в System.Data.dll, но не было обработано в пользовательском коде

Дополнительная информация: уже существует открытый DataReader, связанный с этой Командой, который необходимо сначала закрыть ».


person Koh Zhen Xuan    schedule 22.07.2016    source источник
comment
пожалуйста, используйте параметризованные запросы !!!! msdn.microsoft.com/en-us/library /bb738521(v=vs.100).aspx   -  person Nikola Sivkov    schedule 22.07.2016


Ответы (3)


попробуйте добавить MultipleActiveResultSets = True в ваше соединение как

 SqlConnection conn =
new SqlConnection("Data Source=MCDU11;
Initial Catalog=VisitorManagement;Integrated Security=True;MultipleActiveResultSets=True");

а также

    SqlCommand cmd1 = 
new SqlCommand("update SecurityUser set LoginOn ='" + DateTime.Now + "' 
WHERE Username ='" + txtUsername.Text.Trim() + "'",conn);
person nazark    schedule 22.07.2016
comment
привет, спасибо за помощь, которую они показывают мне эту ошибку. Исключение типа «System.Data.SqlClient.SqlException» произошло в System.Data.dll, но не было обработано в пользовательском коде. Дополнительная информация: неправильный синтаксис рядом с ключевым словом «WHERE». - person Koh Zhen Xuan; 22.07.2016
comment
это другая ошибка, связанная с вашим оператором sql в cmd1, см. обновленный результат - person nazark; 22.07.2016

«Уже существует открытый DataReader, связанный с этой Командой, который необходимо сначала закрыть».

Сообщение об исключении настолько ясно, что вы не можете выполнять какие-либо команды для соединения (другой DataReader, NonQuery ...), пока исходный DataReader не будет закрыт. В ваших случаях код, который генерирует исключение,

cmd1.ExecuteNonQuery();

Вы должны распаковать свой код в 2 части, первая будет получать данные из БД, а вторая обновится, если шаг № 1 будет успешным.

Для демонстрации:

private static string ConnectionString = "Data Source=MCDU11;Initial Catalog=VisitorManagement;Integrated Security=True";

protected string GetLoggedUserId(string username, string password) {
    var id = string.Empty;
    using(var conn = new SqlConnection(ConnectionString) {
        var cmd = new SqlCommand("SELECT * FROM SecurityUser WHERE Username = '" + username + "' AND "
                                        + "Password='" + password)  + "'" , conn);
        conn.Open();
        using(var reader = cmd.ExecuteReader()){
            if(reader.Read()){
                id = reader["Id"].ToString();
            }   
        }
    } 
    return id;
}

protected string UpdateLoggedUser(string username) {
    using(var conn = new SqlConnection(ConnectionString) {
        var cmd = new SqlCommand("update SecurityUser set LoginOn ='" + DateTime.Now + "' , " + "WHERE Username ='" + username + "'", conn);
        conn.Open();
        cmd.ExecuteNonQuery();
    } 
}

protected void btnLogin_Click(object sender, EventArgs e) {

    var loggedId = GetLoggedUserId(txtUsername.Text.Trim(),Encrypt(txtPassword.Text.Trim()));

    if(!string.IsNullOrWhiteSpace(loggedId))
    {
        UpdateLoggedUser(txtUsername.Text.Trim());
        Response.Redirect("SecurityHome.aspx");
    }
    else
    {
        lblError.Text = "Either username and/or password is wrong. Please try again!";
    }   
}

Согласно MSDN: https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.80).aspx

person Edward N    schedule 22.07.2016

Пользователь DataAdapter. Он быстрее, чем DataReader, а также отключал ориентированную архитектуру.

    string connString = "Data Source=MCDU11;Initial Catalog=VisitorManagement;Integrated Security=True";

    SqlCommand cmd = new SqlCommand("SELECT * FROM SecurityUser WHERE Username = '" + txtUsername.Text.Trim() + "' AND "
                                        + "Password='" + Encrypt(txtPassword.Text.Trim()) + "'" , conn);

    SqlCommand cmd1 = new SqlCommand("update SecurityUser set LoginOn ='" + DateTime.Now + "' , " + "WHERE Username ='" + txtUsername.Text.Trim() + "'", conn);
   using (SqlConnection conn = new SqlConnection(connString))  
{

    using (SqlDataAdapter a = new SqlDataAdapter(
            cmd, conn))
    {
                DataTable t = new DataTable();
                a.Fill(t);

       if (t.Rows.Count > 0)
       {

        Session["Username"] = txtUsername.Text;
        Session["Id"] = t[0]["Id"].ToString();
        cmd1.ExecuteNonQuery();
        Response.Redirect("SecurityHome.aspx");

       }
       else
       {
        lblError.Text = "Either username and/or password is wrong. Please try again!";
       }

   }

   }
person mmushtaq    schedule 22.07.2016