相关文章推荐
爱健身的镜子  ·  22 ...·  1 年前    · 
悲伤的机器人  ·  ls、ll、su command ...·  1 年前    · 
淡定的槟榔  ·  vue.js - How to solve ...·  1 年前    · 
我必须在同一个按钮中的另一个查询中使用查询的结果,当我执行这段代码时,我有。已经有一个打开的DataReader与这个命令相关,必须先关闭。

protected void Button1_Click(object sender, EventArgs e)
    con.Open();
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    //use a sqlparameter to avoid the possibility of sql injection
    SqlParameter p = new SqlParameter("p1", ddlClients.SelectedValue);
    SqlParameter q = new SqlParameter("q1", ddlProjets.SelectedValue);
    SqlParameter t = new SqlParameter("t1", ddlProduits.SelectedValue);
    SqlParameter r = new SqlParameter("r1", ddlShift.SelectedValue);
    SqlParameter s = new SqlParameter("s1", ddlDefaut.SelectedValue);
    cmd.Parameters.Add(p);
    cmd.Parameters.Add(q);
    cmd.Parameters.Add(r);
    cmd.Parameters.Add(s);
    cmd.Parameters.Add(t);
    cmd.CommandText = "insert into Aff (Operations_ID, Emplacements_ID, Projets_ID, Zones_ID, Machines_ID )values(15, 25, @p1, 1, 5)";
    cmd.CommandText = "SELECT IDENT_CURRENT('Aff')";
    SqlDataReader reader = cmd.ExecuteReader();
    if (reader.Read())
        cmd.CommandText = "insert into Insp (Affectations_ID, Shifts_ID, Produits_ID, date,  Machine) values(reader ,@r1, @t1, '" + TextBox1.Text + "', '" + TextBox2.Text + "')"; // here is the problem
    cmd.CommandText = "SELECT IDENT_CURRENT('Insp')";
    SqlDataReader reader2 = cmd.ExecuteReader();
    if (reader2.Read())
        cmd.CommandText = "insert into def (BaseDefauts_ID, Inspection_ID,   matricule, quantite) values(@s1, reader2, '" + TextBox3.Text + "', '" + TextBox4.Text + "')";
    cmd.ExecuteNonQuery();
    con.Close();
    Response.Redirect("Cascad.aspx");
    
5 个评论
你能不能只用 "连接",这样你就可以把新的 "查询 "连接到第一个查询的结果中......。
IMO你可以重构,在一个查询中完成所有的事情(使用参数而不是SQL连接)......无论如何......SqlDataReader在每次使用后必须被处理掉(连接也是如此)。
注意将CommandText设置为背对背是不行的。第一个sql将被后一个sql所取代。你需要执行第一个,或者将它们合并成一个命令文本。
不要在查询中直接使用GUI值。这会使你的代码容易受到代码注入的影响。
我这样做了,但我仍然有问题,它不承认插入命令中的 "读者",使用(SqlCommand cmmd = new SqlCommand("SELECT IDENT_CURRENT('Aff')", con)){使用(SqlDataReader reader = cmmd.ExecuteReader()){ if (read()) { SqlParameter r = new SqlParameter("r1", ddlShift.SelectValue); cmmd.Parameters.Add(r); cmmd.CommandText = "insert into Insp (Affectations_ID, Shifts_ID, Produits_ID, date, Machine) values(reader ,@r1, '" + TextBox1.Text + "' )"; } cmmd.ExecuteNonQuery(); }
c#
asp.net
visual-studio-2010
sql-server-2008
Lamyae
Lamyae
发布于 2015-01-27
2 个回答
Eren Ersönmez
Eren Ersönmez
发布于 2015-01-27
0 人赞同

已经有一个开放的数据读取器与此命令相关联,必须首先关闭。

你需要处理这个数据读取器,例如。

using(var reader = cmd.ExecuteReader())
   if (reader.Read())