Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Greska Invalid attempt to call Read when reader is closed

  • 9 odgovora
  • 4.352 pregleda

Najnovija ↓

Greska Invalid attempt to call Read when reader is closed 20.06.2009. u 16:30 · pre 211 meseci #1
Kako da prevazidjem ovu gresku "Invalid attempt to call Read when reader is closed.", koja mi se pojavljuje kada se SqlDataReader dr ucitava u while petlji?

Code:
public void fillTable(SqlDataReader dr, string tabela, string kolona)
        {
            while (dr.Read())
            {
                int a = dr.FieldCount;
                for (int i = 0; i < a; i++)
                {
                    Dodavanje(tabela, kolona, dr.GetString(i));
                }
            }
            conn.Close();
        }

        public void Dodavanje(string table, string kolona, string promenjiva)
        {
            string sSQL = "INSERT INTO " + table + " (" + kolona + ") VALUES ('" + promenjiva + "')";
            ExecuteSQL(sSQL);
        }

Code:
protected void ExecuteSQL(string sSQL)
        {
            SqlCommand cmd = new SqlCommand(sSQL, conn);
            try
            {
                conn.Close();
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }
Re: Greska Invalid attempt to call Read when reader is closed 21.06.2009. u 15:07 · pre 211 meseci #3
Moze i ovako (mislim da je sad sve tu), ali opet prijavljuje istu gresku:
Code:

namespace Proba
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        clsFunctions clsFunc = new clsFunctions();
   
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string sSQL = "SELECT PomocniUredjaj FROM tblPomocniUredjaj WHERE ID LIKE '" + clsVariables.sID.ToString() + "' ORDER BY PomocniUredjaj ASC";
            SqlDataReader dr = clsFunc.fillZapis(sSQL);
            clsFunc.fillTable(dr, "Table2", "PomocniUredjaj");
        }
    }
}


namespace Proba
{
    class clsVariables
    {
        public static int sID;
    }
}


namespace Proba
{
    public class clsFunctions:Proba.Class1
    {
        public SqlDataReader fillZapis(string sSQL)
        {
            return setDataReader(sSQL);
        }

        public void fillTable(SqlDataReader dr, string tabela, string kolona)
        {
            while (dr.Read())
            {
                int a = dr.FieldCount;
                for (int i = 0; i < a; i++)
                {
                    Dodavanje(tabela, kolona, dr.GetString(i));
                }
            }
            conn.Close();
        }

        public void Dodavanje(string table, string kolona, string promenjiva)
        {
            string sSQL = "INSERT INTO " + table + " (" + kolona + ") VALUES ('" + promenjiva + "')";
            ExecuteSQL(sSQL);
        }
    }
}


namespace Proba
{
    public class Class1
    {
        protected SqlDataReader setDataReader(string sSQL)
        {
            SqlCommand comm = new SqlCommand(sSQL, conn);
            SqlDataReader rtnReader;
            conn.Close();
            conn.Open();
            rtnReader = comm.ExecuteReader(CommandBehavior.CloseConnection);
            return rtnReader;
        }

        protected void ExecuteSQL(string sSQL)
        {
            SqlCommand cmd = new SqlCommand(sSQL, conn);
            try
            {
                conn.Close();
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }
    }
}


Prvo citanje petlje while u funkciji filltable prodje bez problema, ali kada ponovo pokusa da udje u petlju onda izbaci gresku: "Invalid attempt to call Read when reader is closed."
Re: Greska Invalid attempt to call Read when reader is closed 22.06.2009. u 13:03 · pre 211 meseci #5
Ovde ne zatvaraj konekciju u finally
Code:

 protected void ExecuteSQL(string sSQL)
        {
            SqlCommand cmd = new SqlCommand(sSQL, conn);
            try
            {
                conn.Close();
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();------ukloniti
            }
        }

Ovde ne pozivaj conn.Close ako si vec stavio reader CommandBehavior.CloseConnection nego pozovi dr.Close();
 public void fillTable(SqlDataReader dr, string tabela, string kolona)
        {
            while (dr.Read())
            {
                int a = dr.FieldCount;
                for (int i = 0; i < a; i++)
                {
                    Dodavanje(tabela, kolona, dr.GetString(i));
                }
            }
            conn.Close();-----zamjena dr.Close();
        }
Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Re: Greska Invalid attempt to call Read when reader is closed 23.06.2009. u 11:27 · pre 211 meseci #6
Probao sa prilozenim korekcijama ali nista se ne desava :( On odradi punjenje tabele za prvu iscitanu vrednost, ali kad treba da pocne sa citanjem druge vrednosti, na pocetku while petlje, on se skuca i izbaci gresku "Invalid attempt to call Read when reader is closed." I meni je najpre palo na pamet da je negde konekcija zatvorena i probao sam da izbacim
Code:
            
            finally
            {
                conn.Close();
            }

, ali se nista nije desilo. Sada sam uvrstio i ono dr.Close() ali on do toga ni ne stigne :(

Mislim da mi pravi problem ovo:
Code:

            SqlCommand cmd = new SqlCommand(sSQL, conn);
            try
            {
                conn.Close();--------- ovo?!!!!!!!!
                conn.Open();--------- i ovo?!!!!!!!!
                cmd.ExecuteNonQuery();
            }


Mislim da je tu greska jer konekciju koja je pokrenuta kod Reader-a ovde se zatvori i otvora se nova, pa mislim da ga to buni. Ali opet ne znam kako da se resim ovog problema?! :(

Alternativa je neki drugi nacin na koji bi punio jednu tabelu sa odabranim podacima iz neke druge tabele, pri cemu je broj tih podataka n. Imali neko neki predlog?! :)
Re: Greska Invalid attempt to call Read when reader is closed 23.06.2009. u 12:52 · pre 211 meseci #7
Negdje si zatvorio konekciju pa ti je reader zatvoren. Ukloni i CommandBehavior.CloseConnection sa DataReader-a i provjeri sva mjesta gdje zatvaras konekciju.
Razmisli o koristenju rijeci using za koristenje konekcije jer onda ne moras pozvati conn.close.
Inace kod ti je extra zbrkan....
Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Re: Greska Invalid attempt to call Read when reader is closed 23.06.2009. u 17:31 · pre 211 meseci #8
Pojednostavio sam kod i pokusao da probam sve i na kraju nista :(

Code:
       

        string sSQL = "SELECT PomocniUredjaj FROM tblPomocniUredjaj WHERE ID LIKE '1' ORDER BY PomocniUredjaj ASC";
        clsFunc.fillTable2(sSQL, "Table2", "PomocniUredjaj");

        public void fillTable2(string sSQL, string table, string kolona)
        {
            conn.Open();
            SqlCommand comm = new SqlCommand(sSQL, conn);
            SqlDataReader dr = comm.ExecuteReader();
            try
            {
                while (dr.Read())
                {
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        comm.CommandText = "INSERT INTO " + table + " (" + kolona + ") VALUES ('" + dr.GetString(i) + "')";
                        try
                        {
                            comm.ExecuteNonQuery();
                        }
                        catch
                        {
                            MessageBox.Show("Greska pri insertovanju!");
                        }
                    }
                }
            }
            catch
            {
                MessageBox.Show("Greska!");
            }
            finally
            {
                dr.Close();
                conn.Close();
            }
        }


Uvek se vratim na isto. Mislim da je zakljucak svega da je ne moguce u isto vreme citati i upisivati jer se koristi ista konekcija. Voleo bih da gresim i da me neko ispravi jer bi tada ovaj koncept imao nade......

Ali ako je ovo istina sto sam predpostavio onda imam novi/stari problem, kako citati podatke iz jedne tabele, dobijene na osnovu upita, i potom ih upisati u drugu tabelu??????????????????????? :(
Re: Greska Invalid attempt to call Read when reader is closed 23.06.2009. u 19:23 · pre 211 meseci #9
Moguce posto reader sluzi samo za citanje podataka.
Najbolje da rezultat readera upunis u neki genericku listu (List<Klasa>) i onda prodjes foreach petljom kroz sve objekte u toj listi i za svaki objekat izvrsis insert pozivajuci ExecuteNonQuery.
Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Re: Greska Invalid attempt to call Read when reader is closed 14.07.2009. u 10:23 · pre 210 meseci
izmenjeno 1 put, poslednji put draganmit 14.07.2009. u 11:14
  1. draganmit14.07.2009. u 11:14zapis iz teksta poruke
#10
Odlican predlog logic_rabbit. Ja sam VB programer ali pomocicu ti na neki nacin.

Probaj prvo sa DataTable:

Code:

SqlCommand comm = new SqlCommand(sSQL, conn);
SqlDataReader dr = comm.ExecuteReader();
DataTable dt = New DataTable;
dt.Load(dr);
     foreach (DataRowView drv in dt.DefaultView) {
        comm.CommandText = "INSERT INTO " + table + " (" + kolona + ") VALUES ('" + drv("promenljiva") + "')";
         try {
            comm.ExecuteNonQuery();
         }
        catch (Exception ex) {
            
            
            MessageBox.Show("Greska pri insertovanju!");
         }
    }
 }


Mada ne odobravam konkatenaciju u commandtext-u, radije koristim parametre ali u tvom slucaju, kad si vec poceo tako, nastavi sa tim..
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme