try
            {
                conn.Open();                cmd_InstI = new SqlCommand("insert_infoPsn_1", conn);
                cmd_InstI.CommandType = CommandType.StoredProcedure;
                SqlDataReader dr = cmd.ExecuteReader();                while (dr.Read())
                {
                    cmd_InstI.Parameters.Add("@F2_2", "身份证");
                    cmd_InstI.Parameters.Add("@F3_3", dr[1].ToString());
                    cmd_InstI.Parameters.Add("@F4_4", dr[0].ToString());
                    cmd_InstI.Parameters.Add("@F5_5", "否");
                    cmd_InstI.Parameters.Add("@F6_6", "其他人员");
                    cmd_InstI.Parameters.Add("@F7_7", "");                    cmd_InstI.ExecuteNonQuery();
                    cmd_InstI.Parameters.Clear();                } 
                    dr.Close();
            }
            catch (Exception eI)
            {
                MessageBox.Show(eI.Message, "eI");
            }
            finally
            {
                conn.Close();
            }上述代码想实现由一个表中读取数据,写到另一个表的指定列中(其他列补常数值),错误提示为"已有打开的与此命令相关联的 DataReader,必须首先将它关闭。" System.Exception {System.InvalidOperationException}问:是不是在cmd_InstI.ExecuteNonQuery();的执行过程中,与SqlDataReader的open()由什么关系? 如何解决?

解决方案 »

  1.   

    同一个数据库连接上不能同时打开两个reader,必须先关闭一个,然后再打开新的reader.
    你也可以新建立一个连接,然后打开reader,之后关闭之.你的代码可能在什么地方已经打开了一个reader了,和ExecuteNonQuery没有关系
      

  2.   

    这样吧。你把SqlDataReader读取的数据放到一个ArrayList中,
    然后再 cmd_InstI.Parameters.Add("",list[1]); ArrayList list = new ArrayList();
     while (dr.Read())
     {
      for(int i=0;i<dr.FieldCount ; i++)
      {
       list.Add(dr[i]);
      }
     }
    dr.Close();  cmd_InstI.Parameters.Add("@F2_2", "身份证");
                        cmd_InstI.Parameters.Add("@F3_3", list[1].ToString());
                        cmd_InstI.Parameters.Add("@F4_4", list[0].ToString());
                        cmd_InstI.Parameters.Add("@F5_5", "否");
                        cmd_InstI.Parameters.Add("@F6_6", "其他人员");
                        cmd_InstI.Parameters.Add("@F7_7", "");                    cmd_InstI.ExecuteNonQuery();
                        cmd_InstI.Parameters.Clear();
      

  3.   

    DataReader相当只进的游标.只是向前提取.
    但 cmd_InstI.ExecuteNonQuery(); 是向数据库提交,虽说是不返回什么,但是却是有一个影响行数会返回的.你用同样一个对象在读的时候去操作数据库,那么DataReader就无法定位了.也不允许这样.
    你再创建一个对象 SqlCommand对象来操作,要不你先放在本地的数据集里,即一个dataset或datatable中.循环这个table再去操作就是了.