【问题标题】:ASP.NET unable select and UpdateASP.NET 无法选择和更新
【发布时间】:2016-07-22 06:51:59
【问题描述】:
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 关联 这个命令必须先关闭。”

【问题讨论】:

标签: c# sql asp.net select insert-update


【解决方案1】:

尝试在您的连接中添加 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);

【讨论】:

  • 您好,感谢他们向我显示此错误的帮助,“System.Data.dll 中发生了 'System.Data.SqlClient.SqlException' 类型的异常,但未在用户代码中处理其他信息:关键字“WHERE”附近的语法不正确。”
  • 这是与你在cmd1中的sql语句相关的不同错误,查看更新结果
【解决方案2】:

"已经有一个打开的 DataReader 与此命令关联 必须先关闭。”

异常消息非常清楚,在关闭原始 DataReader 之前,您无法执行连接的任何命令(另一个 DataReader、NonQuery ...)。 在您的情况下,引发异常的代码是

cmd1.ExecuteNonQuery();

您应该将您的代码提取到 2 个 motheds 中,第一个将从 DB 获取数据,如果 step#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

【讨论】:

    【解决方案3】:

    用户 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!";
           }
    
       }
    
       }
    

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 2016-08-03
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多