[ wex-alpha @ 09.06.2010. 10:48 ] @
Evo vec par dana pokusavam na razne nacine i nikako ne mogu da uspijem da uradim update tabele :(

Najvise bi mi odgovaralo da uradim update sljedecim kodom (koji ne radi):

Code (csharp):

public void update(string ime, string prezime, int id)

        {

            SqlCeCommand DAUpdateCmd;
            DataSet ds = new DataSet();

            SqlCeConnection con = new SqlCeConnection(@"Data Source=C:\\osoblje.sdf");

            con.Open();
            SqlCeDataAdapter da = new SqlCeDataAdapter("SELECT * from clanovi ORDER BY id", con);

            DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime), (prezime) VALUES(@ime,@prezime) WHERE id = id, con");
            da.UpdateCommand = DAUpdateCmd;

           
            da.Fill(ds, "clanovi");

            da.Update(ds, "clanovi");

            con.Close();
        }

 


Zadnji dio komande WHERE id = id, con, sam probao na razlicite nacine da definisem:
1. WHERE id = id, con
2. WHERE id = 'id', con
3. WHERE id = @id, con

Cak sam stavljao i obican broj umjesto id, koristeci sve kombinacije. Ali uzalud... negdje grijesim, i zaista ne mogu da vidim gdje.

Pomozite mi :)
[ n a t a s a @ 09.06.2010. 12:01 ] @
Evo može ovako:

SqlCeCommand("INSERT INTO clanovi (ime, prezime) VALUES('" +ime+ "','" +prezime+ "') WHERE id ="+id, con);

ili preko parametrizovanog upita ili da napraviš funkciju u bazi pa da je pozoveš i proslediš joj parametre...


pozz
[ wex-alpha @ 09.06.2010. 12:15 ] @
Natasa hvala na odgovoru :)

Sad sam upravo probao, ali nece. Nista se ne desi.

Code (csharp):


 DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime, prezime) VALUES('" + ime + "','" + prezime + "') WHERE id =" + id, con);

 da.UpdateCommand = DAUpdateCmd;


 



Ovo je totalno izludjujuce.
[ Fedya @ 09.06.2010. 12:18 ] @
Nije preporucljivo nadovezivati stringove prilikom generisanja upita koji se salje bazi (pogledaj SQL Injection).

SqlCommand koji si koristio ima property Parameters koji sluzi za strogo tipizirano nadovezivanje.

Otplike ovako (kod kucam u editor na ESu i verovatno ima gresaka):

promeni:
Code:

DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime), (prezime) VALUES(@ime,@prezime) WHERE id = @id, con");


(znaci id => @id da bi bilo ocigledno koji od dva "id-ja" je parametar)

i dodaj:

Code:

DAUpdateCmd.Parameters.Add(new SqlParameter() {ParameterName = @ime, Value = ime});
DAUpdateCmd.Parameters.Add(new SqlParameter() {ParameterName = @prezime, Value = prezime});
DAUpdateCmd.Parameters.Add(new SqlParameter() {ParameterName = @id, Value = id});

pre nego sto komandu vezes za adapter.
[ wex-alpha @ 09.06.2010. 12:49 ] @
Hvala na pomoci, ali jos uvijek ne radi :(

Evo sada preradjenog koda:



Code (csharp):


public void update(string ime, string prezime, int id)
        {

            SqlCeCommand DAUpdateCmd;
            DataSet ds = new DataSet();

            SqlCeConnection con = new SqlCeConnection(@"Data Source=C:\\osoblje.sdf");

            con.Open();
                       
            SqlCeDataAdapter da = new SqlCeDataAdapter("SELECT * from clanovi ORDER BY id", con);

            DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime), (prezime) VALUES(@ime,@prezime) WHERE id = @id, con");



            DAUpdateCmd.Parameters.Add(new SqlParameter() { ParameterName = @ime, Value = ime });
            DAUpdateCmd.Parameters.Add(new SqlParameter() { ParameterName = @prezime, Value = prezime });
            DAUpdateCmd.Parameters.Add(new SqlParameter() { ParameterName = Convert.ToString(@id), Value = id });

           

         da.UpdateCommand = DAUpdateCmd;
         


            da.Fill(ds, "clanovi");

            da.Update(ds, "clanovi");

            con.Close();

 


Morao sam konvertovati zadnju liniju, jer je izbacivao gresku
Code (csharp):

DAUpdateCmd.Parameters.Add(new SqlParameter() { ParameterName = Convert.ToString(@id), Value = id });
 


Sad kad ga kompajliram, izbaci sljedecu gresku:


Citat:

The SqlCeParameterCollection only accepts non-null SqlCeParameter type objects, not SqlParameter objects



Onda sam malo petljao po kodu koristeci smjernice koje sam dobio, i sklopio sam sljedece:

Code (csharp):


SqlCeCommand DAUpdateCmd;
            DataSet ds = new DataSet();

            SqlCeConnection con = new SqlCeConnection(@"Data Source=C:\\osoblje.sdf");

            con.Open();
                       
            SqlCeDataAdapter da = new SqlCeDataAdapter("SELECT * from clanovi ORDER BY id", con);

            DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime), (prezime) VALUES(@ime,@prezime) WHERE id = @id, con");

            DAUpdateCmd.Parameters.AddWithValue("@ime", ime);
            DAUpdateCmd.Parameters.AddWithValue("@prezime", prezime);
            DAUpdateCmd.Parameters.AddWithValue("@id", id);

         da.UpdateCommand = DAUpdateCmd;        

            da.Fill(ds, "clanovi");
            da.Update(ds, "clanovi");

            con.Close();


 


Ovaj kod se kompajlira i nema greske. Kad stavim BP na metodu koju pozivam, vidim da se moje varijable uredno prosljedjuju, ali nista nije azurirano :(

Vise cupam kosu ovdje :(
[ wex-alpha @ 09.06.2010. 13:24 ] @
Evo jos jedne ideje, koja ne radi bas kako zelim:

Code (csharp):

 public void jebimater(string ime, string prezime, int c)
         {

             SqlCeConnection con = new SqlCeConnection(@"Data Source=C:\\osoblje.sdf");
             SqlCeCommand komanda = new SqlCeCommand("Select * from clanovi", con);
             DataSet ds1 = new DataSet();
             con.Open();

             SqlCeDataAdapter da = new SqlCeDataAdapter(komanda);
             SqlCeCommandBuilder cb = new SqlCeCommandBuilder(da);
             DataTable dt = new DataTable();

             da.Fill(ds1, "clanovi");          
           
             DataRow dRow2 = ds1.Tables["clanovi"].Rows[c];

           
           

             dRow2[1] = ime;
             dRow2[2] = prezime;          
             da.Update(ds1, "clanovi");
             con.Close();
       
       
        }


 


Ovo radi donekle, ali kako da rijesim sljedeci problem.


Kako da kontrolisem sljedece:

Code (csharp):

 DataRow dRow2 = ds1.Tables["clanovi"].Rows[c];
 


Zadnji red int varijabla. Ako saljem id, onda se pisu pogresni zapisi i dosta cesto prijavljuje out of bonds. Koliko sam skontao, DataSet stavi na "kamaru" sve zapise, i ne obazire se na id.

Tako ako imam 10 zapisa, a u medjuvremenu sam pisao/brisao. I onda mi se napunio id u tabeli, sa recimo brojem 50... ako posaljem taj broj 50, onda ce izbaciti out of bonds exception.



[ wex-alpha @ 09.06.2010. 18:58 ] @
Kako god okrenem, ne mogu pristupati bazi preko DataRow, jer imam dosta koda koji je zamrsen. tako da mi je najbolji nacin da direktno pisem u bazu... ali jos uvijek nisam provalio kako.
[ wex-alpha @ 09.06.2010. 20:24 ] @
Uspjeo sam rijesiti problem koristeci DataRow nacin.

Dodijelim id kljuceve iz baze direktno u dataset i onda manipulisem sa njim kako mi treba. Ako je neko zainteresovan, mogu napisati u detalje.


Mada jos uvijek mi nije jasno zasto direktno u bazu nije radilo. A probao sam toliko kombinacija :(
[ DarkMan @ 11.06.2010. 13:02 ] @
Greska ti je bila u upitu i samom kodu:
Code (csharp):

DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime), (prezime) VALUES(@ime,@prezime) WHERE id = @id, con");
 

Prvo ne pise se INSERT INTO clanovi (ime), (prezime) VALUES... vec INSERT INTO clanovi (ime, prezime) VALUES...
Drugo, na kraju , con treba van navodnika.
Znaci:
Code (csharp):

DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi(ime,prezime) VALUES(@ime,@prezime) WHERE id = @id", con);
 
[ wex-alpha @ 11.06.2010. 13:14 ] @
Da, gresku broj 2 sam i ja skontao, ali opet nije radilo.

Dakle, problem je bio u samoj izjavi.

Probat cu cim stignem.


Mnogo ti hvala :)
[ Zidar @ 11.06.2010. 16:22 ] @
Ovo je poslendje sto se 'ocekuje' da radui:

Code:
INSERT INTO clanovi(ime,prezime) VALUES(@ime,@prezime) WHERE id = @id


Ima jedan problem. (@ime,@prezime) i @id
su oznake za SQL varijable. SQL varijable su vidljive samo u jednom batchu i moraju biti deklarisane na pocetku. Ovde to ne vidim. Trebalo bi da kompletan izraz izgleda nekako ovako:

Code:
DECLARE @ime varchar(35) ,@prezime varchar(35), @Id int
;
SELECT @ime = 'John', @prezime = 'Doe', @ID = 175;
INSERT INTO clanovi(ime,prezime) VALUES(@ime,@prezime) WHERE id = @id
;


A moglo bi da se napise i nesto ovako:
Code:

INSERT INTO clanovi ( ime, prezime ) VALUES ('John' , 'Doe' ) WHERE id = 175


Tvoj SqlCeCommand ocekuje komandu koju MS SQL moze da izvrsi. Da bi se komanda izvrsila, moras proslediti stvarne vrednosti, a ne parametr. Ovko nekako, verovatno ovako nekako (ja ne radim .NET pa je sintaksa mozda off, ali kapiras ideju?):
Code:

DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi ( ime, prezime ) VALUES ('John' , 'Doe' ) WHERE id = 175", con");
da.UpdateCommand = DAUpdateCmd;

SQL deo komande mora da izgleda onako kako ga server moze izvrsiti.
Mozda moze da se SQL deo sagradi pre nego sto izdas komandu DAUpdateCmd =... Neka su var1, var2 varijable u tvom kodu gde imas imas ,prezime. U var3 cuvas id koji zelis da posaljes serveru. Gradjenje SQL stringa odradis pre DAUpdateCmd, ovako nekako:
Code:

strSQL = "INSERT INTO clanovi ( ime, prezime ) VALUES ('" + var1 & "' , '" & var2 +" ' ) WHERE id = " + var3

DAUpdateCmd = new SqlCeCommandstrSQL , con");
da.UpdateCommand = DAUpdateCmd;

Varijabla strSQL sluzi da se napravi SQL narednba koja se moze izvrsiti. U ovom slucaju, vrednost strSQL bila bi
strSQL = "INSERT INTO clanovi ( ime, prezime ) VALUES ('John' , 'Doe' ) WHERE id = 175",
sto bi trebalo da se izvrsi bez problema.




[ DarkMan @ 14.06.2010. 10:08 ] @
Citat:

Ima jedan problem. (@ime,@prezime) i @id
su oznake za SQL varijable. SQL varijable su vidljive samo u jednom batchu i moraju biti deklarisane na pocetku. Ovde to ne vidim.


U ovom slucaju nisu varijable vec parametri za koje je vec postovan kod u jednom od prethodnih odgovora.

Code:

  DAUpdateCmd = new SqlCeCommand("INSERT INTO clanovi (ime, prezime) VALUES(@ime,@prezime) WHERE id = @id", con);
  DAUpdateCmd.Parameters.AddWithValue("@ime", ime);
  DAUpdateCmd.Parameters.AddWithValue("@prezime", prezime);
  DAUpdateCmd.Parameters.AddWithValue("@id", id);


Citat:

strSQL = "INSERT INTO clanovi ( ime, prezime ) VALUES ('" + var1 & "' , '" & var2 +" ' ) WHERE id = " + var3

Za ovo je vec receno da je podlozno SQL Injection-u.
Na primer ako korisnik unese za ime sledece:
Code:

bla',''); delete clanovi;--

Dobice se sledeci upit:
Code:

insert into clanovi(ime, prezime) values('bla',''); delete clanovi;--','') where id = 0

Naravno ovo se sve moze spreciti korekcijom vrednosti parametara (na primer zamenom jednog apostrofa sa dva).
Medjutim to je nepotrebno ako se koristi komanda sa parametrima (u pozadini se komanda sa parametrima izvrsava preko stored procedure koja onemogucava sql injection).

[ Zidar @ 14.06.2010. 14:04 ] @
DarkMan je u pravu. Ko mi je kriv kad se mesam u ono sto ne umem da radim (.NET) Izvinjavam se za zabunu.