[ bigguy @ 20.06.2009. 15:30 ] @
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();
            }
        }
[ jasamkonj @ 21.06.2009. 12:18 ] @
Koji line code javlja grešku? Da li je SqlDataReader pravilno instanciran pre nego što ga zoveš?
[ bigguy @ 21.06.2009. 14:07 ] @
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."
[ bigguy @ 21.06.2009. 17:32 ] @
Pitanje se moze postaviti i ovako: Kako da insertujem vrednosti, dobijene iz select izraza iz jedne tabele, u drugu tabelu?
[ logic_rabbit @ 22.06.2009. 12:03 ] @
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();
        }
[ bigguy @ 23.06.2009. 10:27 ] @
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?!
[ logic_rabbit @ 23.06.2009. 11:52 ] @
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....
[ bigguy @ 23.06.2009. 16:31 ] @
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???????????????????????
[ logic_rabbit @ 23.06.2009. 18:23 ] @
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.
[ draganmit @ 14.07.2009. 09:23 ] @
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]