[ dava @ 14.08.2009. 13:58 ] @
Imam dataGridView koji je bindovan za jednu tabelu. Taj grid prikazuje podatke koji su rezultat selekta sa where uslovom (po jednoj koloni). E sad, imam problem kada hocu da update-ujem tu tabelu, javlja gresku:
Citat:
Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.

Ovako sam vezao grid i pokupio podatke:
Code:


OleDbDataAdapter daCijene;
DataTable Cijene;

...

            string query = "SELECT Pozivni, Cijene.ID_Br, Tarifa, FL_Charge, FL_Duration, Unit_Charge, Unit_Duration FROM CIJENE INNER JOIN POZIVNI_BR ON CIJENE.id_BR = POZIVNI_BR.id_bR " +
                "WHERE Cijene.Tab = '" + cmbCostTrunk.Text +"'";
            daCijene = new OleDbDataAdapter(query, connString);
            Cijene = new DataTable();
            daCijene.Fill(Cijene);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = Cijene;

            dgCosts.DataSource = bSource;



Ovo mi je sve radilo dok nisam postavio uslov po kojem se selektuju podaci i prikazuju u grid. Nemam nekog iskustva sa bindovanim gridovima pa ako moze pomoc.
[ marko_81 @ 14.08.2009. 14:04 ] @
Pogledaj ovo http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/5dec5633-ac84-48d9-8fd6-5c7601be4ccd.
Mozda ce ti pomoci.
[ dava @ 14.08.2009. 14:22 ] @
Hvala na linku, ali mi nije pomogao.
Tamo je primjer koji ne prikazuje filterovane podatke, nego cisti select. To je kod mene radilo dok nisam poslavio filter po jednoj koloni. Takodje, tabela ima primarni kljuc kojeg cine tri kolone.
[ marko_81 @ 14.08.2009. 14:41 ] @
Probaj da pokrenes sam upit da vidis da li ti vraca podatke koji ti trebaju.
[ dava @ 14.08.2009. 14:45 ] @
Ne kontam te. Meni upit vrati slogove i napuni ih u grid, ja u gridu izmjenim neke podatke i idem na dugme Update koje bi trebalo da update-uje tabelu ali mi javi onu gresku.
[ marko_81 @ 14.08.2009. 14:50 ] @
Izvini, nisam skontao da ti radi select a ne radi update. Ne znam kako ti radi metoda za Update ali posto imas spajanje tabela, pretpostavljam da ces morati da modifikujes metodu kojom update-ujes tabelu.
[ dava @ 14.08.2009. 14:59 ] @
Evo update metode:
Code:

        private void cmdUpdCosts_Click(object sender, EventArgs e)
        {
            OleDbCommandBuilder cb = new OleDbCommandBuilder(daCijene);
            OleDbConnection cn = new OleDbConnection(connString);
            
            cb.DataAdapter.SelectCommand = new OleDbCommand("SELECT ID_Br, Tab, Tarifa, FL_Charge, FL_Duration, Unit_Charge, Unit_Duration FROM Cijene", cn);

            try
            {
                daCijene.Update(Cijene);
            }
            catch (InvalidOperationException ioe)
            {
                System.Diagnostics.Debug.WriteLine(ioe.Message.ToString());
                MessageBox.Show(ioe.Message);
            }

        }


Morao sam definisati SelectCommand dataAdapter-a bas zbog toga sto je spojena tabela. Napominjema da mi je radio update dok nisam postavio where uslov u selektu (kad prikazjem podatke).
[ marko_81 @ 14.08.2009. 15:20 ] @
Nisam siguran da li ti ovo moze pomoci: http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.updatecommand(VS.71).aspx
Ako sam skontao, treba ti custom update izraz.
[ dava @ 15.08.2009. 20:17 ] @
Nisam uspio. Evo kod koji sam prepravio sluzeci se primjerom:
Code:

        private void cmdUpdCosts_Click(object sender, EventArgs e)
        {
            OleDbCommandBuilder cb = new OleDbCommandBuilder(daCijene);
            OleDbConnection cn = new OleDbConnection(connString);
            OleDbCommand cmd;

            cb.DataAdapter.SelectCommand = new OleDbCommand("SELECT ID_Br, Tab, Tarifa, FL_Charge, FL_Duration, Unit_Charge, Unit_Duration FROM Cijene", cn);
            cmd = new OleDbCommand();
            OleDbParameter parm = new OleDbParameter();

            cmd.CommandText = "UPDATE Cijene SET FL_Charge = @FL_Charge, SET FL_Duration = @FL_Duration, " +
                                   "SET Unit_Charge = @Unit_Charge, SET Unit_Duration = @Unit_Duration " +
                                   "WHERE ID_BR = @ID_BR AND Tab = @Tab AND Tarifa = @Tarifa";

            cmd.Parameters.Add("@FL_Charge", OleDbType.Currency, 15, dgCosts.Columns[3].ToString());
            cmd.Parameters.Add("@FL_Duration", OleDbType.Numeric, 15, dgCosts.Columns[4].ToString());
            cmd.Parameters.Add("@Unit_Charge", OleDbType.Currency, 15, dgCosts.Columns[5].ToString());
            cmd.Parameters.Add("@Unit_Duration", OleDbType.Numeric, 15, dgCosts.Columns[6].ToString());

            parm = cmd.Parameters.Add("@ID_BR", OleDbType.Char, 50, dgCosts.Columns[1].ToString());
            parm = cmd.Parameters.Add("@Tab", OleDbType.Char, 50, cmbCostTrunk.Text);
            parm = cmd.Parameters.Add("@Tarifa", OleDbType.Char, 50, dgCosts.Columns[2].ToString());
            
            parm.SourceVersion = DataRowVersion.Current;
            daCijene.UpdateCommand = cmd;

            try
            {
                daCijene.Update(Cijene);
            }
            catch (InvalidOperationException ioe)
            {
                System.Diagnostics.Debug.WriteLine(ioe.Message.ToString());
                MessageBox.Show(ioe.Message);
            }

        }


Kod mene je situacija malo komplikovanija nego u onom primjeru.
Neznam tacno kako bi update binding grida radi , ali kontam da se update izvrsava ovako: adapter protrcava kroz grid i na osnovu kljuca kojg sam mu definisao preko OleDbParameter, updejtuje u polja koja sam definisao cmd.Parameters-om?
[ dava @ 18.08.2009. 14:54 ] @
Rjesenje jos nije pronadjeno, ali meni vise i ne treba. Napravio sam metodu koja manuelno update-uje i sve radi savrseno, tako da ovakva genericka sr**ja
treba izbjegavati, bar cu se ja toga drzati.
Sve je to fino, bindovan grid za tabelu, ali evo slucaj kad se malo stvar zakomplikuje, problem. Ovako kad sam napravim svoje metode onda sam car nad kodom.