Система.InvalidOperationException: с этой командой уже связан открытый DataReader, который должен быть закрыт первым

#c#

#c#

Вопрос:

я создаю веб-метод в asmx…. но всякий раз, когда я запускаю этот метод, я получаю эту ошибку… я хочу вручную добавить строку в dataset с помощью datareader [WebMethod]

 public DataSet newleger(string accno, string fromdate, string todate)
{
    SqlConnection con = new SqlConnection(@"Data Source=123-PC;Initial Catalog=bcounts;Persist Security Info=True;User ID=Saba;Password=123");
    con.Open();
    SqlCommand cmd = new SqlCommand("select gt.Value_Date,gt.Voucher_no '-' gr.VchrType as voucher,gt.Acct_Nirration,gr.InstrumentNo,gt.Dr_Amount,gt.Cr_Amount  from gl_transaction gt, Gl_Ref gr where gt.Accountno = '"   accno   "'  and gt.Voucher_No=gr.Voucher_no  and gt.Value_Date between '"   fromdate   "' and '"   todate   "'", con);
    SqlDataAdapter adp = new SqlDataAdapter(cmd);
        SqlDataReader rdr = cmd.ExecuteReader();
    decimal crsum = 0;
    decimal drsum = 0;
    decimal balance = 0;
    DataSet ds = new DataSet("Ledger");;
       adp.Fill(ds);
    if (rdr.HasRows)
    {
        while (rdr.Read())
        {
            if (rdr.GetDecimal(4) > 0)
            {
                balance = balance   rdr.GetDecimal(4);
                drsum  = rdr.GetDecimal(4);
                DataRow dr = ds.Tables[0].NewRow();
                dr[0] = rdr.GetDateTime(0).ToShortDateString();
                dr[1] = rdr.GetString(1);
                dr[2] = rdr.GetString(2);
                dr[3] = rdr.GetString(3);
                dr[4] = rdr.GetDecimal(4).ToString();
                dr[5] = "-";
                ds.Tables[0].Rows.Add(dr);

                //data.Add(new datalist7(rdr.GetDateTime(0).ToShortDateString(), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetDecimal(4).ToString(), "-", balance.ToString()));
            }
            else
            {
                balance = balance - rdr.GetDecimal(5);
                crsum  = rdr.GetDecimal(5);
                DataRow dr = ds.Tables[0].NewRow();
                dr[0] = rdr.GetDateTime(0).ToShortDateString();
                dr[1] = rdr.GetString(1);
                dr[2] = rdr.GetString(2);
                dr[3] = rdr.GetString(3);
                dr[4] = "-";
                dr[5] = rdr.GetDecimal(5).ToString();
                ds.Tables[0].Rows.Add(dr);

               // data.Add(new datalist7(rdr.GetDateTime(0).ToShortDateString(), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), "-", rdr.GetDecimal(5).ToString(), balance.ToString()));
            }
        }

        DataRow dd = ds.Tables[0].NewRow();
        dd[0] = "-";
        dd[1] = "-";
        dd[2] = "-";
        dd[3] = "-";
        dd[4] = drsum.ToString();
        dd[5] = crsum.ToString();
        //data.Add(new datalist7("-", "-", "-", "-", drsum.ToString(), crsum.ToString(), "-"));
    }
    con.Close();
    return ds;
}
  

Комментарии:

1. попробуйте использовать DataAdapter для чтения всех данных сначала в DataSet / DataTable, затем выполните агрегацию и добавьте строку.

2. Я предполагаю, что вы не можете использовать адаптер и считыватель одновременно. Попробуйте закрыть один, прежде чем использовать другой.

3. как использовать datadapter??? дайте какой-нибудь код

4. У вас уже есть on в вашем коде. После того, как вы вызовете Fill, он заполнит ваш набор данных результатом SQL-запроса. Используя программу чтения, вы выполняете двойную работу. передайте набор данных. Таблицы[0] вам не нужен ридер.

5. что я могу исключить в этом коде???? пожалуйста, помогите…

Ответ №1:

Попробуйте это

 public DataSet newleger(string accno, string fromdate, string todate)
{
    SqlConnection con = new SqlConnection(@"Data Source=123-PC;Initial Catalog=bcounts;Persist Security Info=True;User ID=Saba;Password=123");
    con.Open();
    SqlCommand cmd = new SqlCommand("select gt.Value_Date,gt.Voucher_no '-' gr.VchrType as voucher,gt.Acct_Nirration,gr.InstrumentNo,gt.Dr_Amount,gt.Cr_Amount  from gl_transaction gt, Gl_Ref gr where gt.Accountno = '"   accno   "'  and gt.Voucher_No=gr.Voucher_no  and gt.Value_Date between '"   fromdate   "' and '"   todate   "'", con);
    SqlDataAdapter adp = new SqlDataAdapter();
    adp.SelectCommand = cmd;

    decimal crsum = 0;
    decimal drsum = 0;
    decimal balance = 0;
    DataSet ds = new DataSet("Ledger");;
    adp.Fill(ds);

    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        //do stuff here....
        if(Convert.ToDecimal(dr[4]) > 0)
        {
            balance = balance   Convert.ToDecimal(dr[4]);
            drsum  = Convert.ToDecimal(dr[4]);
        }
        else
        {
             balance = balance - Convert.ToDecimal(dr[5]);
             crsum  = Convert.ToDecimal(dr[5]);
        }
    }

    //add the totals
    DataRow dd = ds.Tables[0].NewRow();
    //dd[0] = "-";
    //dd[1] = "-";
    //dd[2] = "-";
    //dd[3] = "-";
    dd[4] = drsum;
    dd[5] = crsum;
    //data.Add(new datalist7("-", "-", "-", "-", drsum.ToString(), crsum.ToString(), "-"));


    return ds;
}
  

Комментарии:

1. что я могу написать вместо rdr?? dr[0] = rdr.GetDateTime(0) . ToShortDateString();

2. Он уже в вашем наборе данных. Попробуйте установить точку останова, и вы сможете просмотреть набор данных и просмотреть табличное представление данных. Ваш набор данных уже заполнен при вызове. SqlDataAdapter . Fill() . Посмотрите мои правки, он, вероятно, будет работать так, как сейчас.

3. Строка не была распознана как допустимая дата-время. теперь я получаю эту ошибку

4. Как выглядит ваша строка?

5. Строка не была распознана как допустимая дата-время. Не удалось сохранить <-> в столбце Value_Date . Ожидае мый тип — DateTime . —>