Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Greska Invalid attempt to call Read when reader is closed

[es] :: .NET :: .NET Desktop razvoj :: Greska Invalid attempt to call Read when reader is closed

[ Pregleda: 2402 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
93.86.119.*



+1 Profil

icon Greska Invalid attempt to call Read when reader is closed20.06.2009. u 15:30 - pre 180 meseci
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();
            }
        }
 
Odgovor na temu

jasamkonj

Član broj: 206494
Poruke: 18
*.cable.triera.net.



+5 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed21.06.2009. u 12:18 - pre 180 meseci
Koji line code javlja grešku? Da li je SqlDataReader pravilno instanciran pre nego što ga zoveš?
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
93.86.119.*



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed21.06.2009. u 14:07 - pre 180 meseci
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."
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
93.86.119.*



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed21.06.2009. u 17:32 - pre 180 meseci
Pitanje se moze postaviti i ovako: Kako da insertujem vrednosti, dobijene iz select izraza iz jedne tabele, u drugu tabelu?
 
Odgovor na temu

logic_rabbit
Radenko Zec
banjaluka

Član broj: 74458
Poruke: 271
*.lanaco.com.



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed22.06.2009. u 12:03 - pre 180 meseci
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();
        }

logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
*.bolnica.org.rs.



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed23.06.2009. u 10:27 - pre 180 meseci
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?!
 
Odgovor na temu

logic_rabbit
Radenko Zec
banjaluka

Član broj: 74458
Poruke: 271
*.lanaco.com.



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed23.06.2009. u 11:52 - pre 180 meseci
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....
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
93.86.172.*



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed23.06.2009. u 16:31 - pre 180 meseci
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???????????????????????
 
Odgovor na temu

logic_rabbit
Radenko Zec
banjaluka

Član broj: 74458
Poruke: 271
*.broadband.blic.net.



+1 Profil

icon Re: Greska Invalid attempt to call Read when reader is closed23.06.2009. u 18:23 - pre 180 meseci
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.
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
 
Odgovor na temu

draganmit
Dragan Mitric
Nova Pazova

Član broj: 61149
Poruke: 7
79.101.215.*

Sajt: www.unicco.rs


Profil

icon Re: Greska Invalid attempt to call Read when reader is closed14.07.2009. u 09:23 - pre 179 meseci
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..

[Ovu poruku je menjao draganmit dana 14.07.2009. u 11:14 GMT+1]
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Greska Invalid attempt to call Read when reader is closed

[ Pregleda: 2402 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.