[ toxi_programer @ 21.02.2008. 21:05 ] @
Pozdrav uvaženi članovi ES foruma.

Pravim ASP.NET aplikaciju. Naišao sam već dva puta na jedan čudan problem, pokušaću da ga izložim što jednostavnije.

Postoji GridView, textbox i dugme. Klikom na dugme se u tabelu( čije redove prikazuje GridView) doda novi red sa vrednošću koja je bila u textbox-u. Zatim, pozovem this.DataBind();
Dakle, pokušavam da dodam novi red i prikažem novododati red u GridView-u. Ovo, naravno, ne funkcioniše kako treba( neće biti prikazan i novi red).

Pokušao sam da problem rešim tako što ću staviti Thread.Sleep( 1000) pre this.DataBind() i - rešio problem. Ali, zašto je ovo pomoglo? Zar se operacija this.DataBind() neće izvršiti tek pošto bude završeno izvršavanje INSERT komande?

Imam VS 2008.
[ mmix @ 22.02.2008. 17:32 ] @
Zvuci sasavo. Daj kod za taj event handler za button click.
[ toxi_programer @ 22.02.2008. 20:06 ] @
Da... Evo ga kod:
Code:

    protected void btnDodajFrazu_Click(object sender, EventArgs e)
    {
        Korisnik k = new Korisnik(this);
        string sqlInsert = "INSERT INTO Fraze( KorisnikId, TextFraze) VALUES(" +
            k.Id.ToString() + ",'" + txtNovaFraza.Text.ToLower() + "')";
        BazaPodataka.IzvrsiNaredbu(sqlInsert); //komentar 1
        System.Threading.Thread.Sleep(1000);
        lblMsg.Text = "Nova fraza \"" + txtNovaFraza.Text.ToLower() + "\" je uspešno dodata."; 
        this.DataBind();
    }


#komentar 1:
BazaPodataka je klasa, a static funkcija IzvrsiNaredbu napravi OleDbCommand od proslednjenog string, konektuje se na bazu, izvrši upit i zatvori konekciju. Baza je Access( iliti Jet, jelte...).

Ako izostavim sleep() f-ju, novododati red se ne prikazuje, a poruka u lblMsg se uredno prikaže. Probao sam da izbacim sleep(), i na njegovo mesto postavim breakpoint i pokrenem debug. I radi lepo, jer kad dođe do breakpointa izvršavanje se zaustavi dok ga ja ne nastavim...
[ mmix @ 22.02.2008. 20:36 ] @
Citat:
toxi_programer: BazaPodataka je klasa, a static funkcija IzvrsiNaredbu napravi OleDbCommand od proslednjenog string, konektuje se na bazu, izvrši upit i zatvori konekciju. Baza je Access( iliti Jet, jelte...).


Ok, pozitivan pomak, greska (ako se tako moze) nazvati je u raskoraku izmedj insert komande i selecta koji radis u DataBind() (pretpostavljam da ga tu radis), iz nekog razloga command se izvrsio ali red jos nije commited u access bazu, shodno tome select je ne vidi, kad mu das sleep ti u stvari ne modifikujes .NET sekvencu izvrsavanja (oledbcommand je vec odradio svoje), jednostavno dajes fore access-u da smesti red u tabelu. Medjutim to je generalno lose, a uzrok je verovatno u konfiguraciji connection i command objekta.
Ajd sad daj samo taj kod za IzvrsiNaredbu metod i koji ti je connection string, negde tu se krije uzrok ovom ponasanju.
[ toxi_programer @ 22.02.2008. 20:40 ] @
Aha, evo i ga i kod koji radi sa bazom:

Code:

...
    private static OleDbConnection KonektujSe()
    {
        OleDbConnection oleConn = new OleDbConnection();

        string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + lokacijaBaze +
            ";Jet OLEDB:Database Password='" + sifra + "'";
        oleConn.ConnectionString = strCon;

        oleConn.Open();
        return oleConn;
    }

    public static int IzvrsiNaredbu(string sqlNaredba)
    {
        OleDbCommand oleCmd = new OleDbCommand(sqlNaredba);
        return IzvrsiNaredbu(oleCmd);
    }

    public static int IzvrsiNaredbu(OleDbCommand sqlNaredba)
    {
        sqlNaredba.Connection = KonektujSe();
        int ret = sqlNaredba.ExecuteNonQuery();
        sqlNaredba.Connection.Close();  
        return ret;
    }

...
[ toxi_programer @ 22.02.2008. 20:48 ] @
Biće da sam ja lud.

Nisam bio zatvorio konekciju, a evo sada sam ispravio kod i izgleda da radi kako treba. Ali nisam još probao kako treba...