我想使用数据阅读器和同时更新声明

时间:2012-01-21 02:39:47

标签: asp.net sql ado.net

这是代码

    String[] month=new String[12]{"January","February","March","April","May","June","July","August","September","Octomber","November","December"};
    int day = DateTime.Now.Day;
    int mon= DateTime.Now.Month;
    mon = mon - 1;      //because month array is with 0
    Label1.Text = day.ToString();
    if (day==21)
    {
        int j = 1;
        SqlCommand cmd1 = new SqlCommand();
        cmd1.Connection = MyConn;
        cmd1.CommandText = "SELECT No_of_times,Dustbin_no from mounthly_data";
        SqlDataReader MyReader = cmd1.ExecuteReader();
        while (MyReader.Read())
        {
            String a = MyReader["No_of_times"].ToString();
            String b = MyReader["Dustbin_no"].ToString();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = MyConn;
            cmd.CommandText = "update Yearly_data set [" + month[mon] + "]='"+a+"' where Dustbin_no='"+b+"'";   //just see ["+month[mon+"] it's imp
            i = cmd.ExecuteNonQuery();    
        }
        MyReader.Close();
    }

我收到错误

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

2 个答案:

答案 0 :(得分:1)

我认为你应该给我们代码块上面的其余代码,因为我不确定ExecuteNonQuery是如何使用datareader的。但是从我可以收集的内容来看,你可能想要的是打开两个独立的连接。每个连接一次只能打开一个datareader。您可以使用两个单独的连接,也可以使用数据表/数据集来查询两个查询的结果。

编辑:从你的其余代码中,是的,使用两个连接将是最简单的答案。当阅读器打开时,与其关联的连接专用于所使用的命令,因此没有其他命令可以使用该连接。

答案 1 :(得分:0)

我建议使用DataTable,因为这个OLEDB示例显示:

public static void TrySomethingLikeThis()
{
  try
  {
    using (OleDbConnection con = new OleDbConnection())
    {
      con.ConnectionString = Users.GetConnectionString();
      con.Open();
      OleDbCommand cmd = new OleDbCommand();
      cmd.Connection = con;
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = "SELECT * FROM Customers";
      OleDbDataAdapter da = new OleDbDataAdapter(cmd);
      DataTable dt = new DataTable();
      da.Fill(dt);
      foreach (DataRow row in dt.AsEnumerable())
      {
        cmd.CommandText = "UPDATE Customers SET CustomerName='Ronnie' WHERE ID = 4";
        cmd.ExecuteNonQuery();
      }
    }
  }
  catch (Exception ex)
  {
    throw new Exception(ex.Message);
  }

}