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

Problem sa update sqlce baze

[es] :: MS SQL :: Problem sa update sqlce baze

[ Pregleda: 3162 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
..to512.806592-163.bih.net.ba.



+13 Profil

icon Problem sa update sqlce baze09.06.2010. u 10:48 - pre 168 meseci
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 :)
 
Odgovor na temu

n a t a s a
beograd

Član broj: 250925
Poruke: 12
*.dynamic.sbb.rs.



Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 12:01 - pre 168 meseci
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
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
..to512.806592-163.bih.net.ba.



+13 Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 12:15 - pre 168 meseci
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.
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
82.117.202.*

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 12:18 - pre 168 meseci
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.
Every hamster has his day.
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
..to512.806592-163.bih.net.ba.



+13 Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 12:49 - pre 168 meseci
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 :(
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
..to512.806592-163.bih.net.ba.



+13 Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 13:24 - pre 168 meseci
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.




 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
85.158.35.*



+13 Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 18:58 - pre 168 meseci
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.
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
85.158.35.*



+13 Profil

icon Re: Problem sa update sqlce baze09.06.2010. u 20:24 - pre 168 meseci
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 :(
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.nsinfo.co.rs.

Jabber: DarkMan


Profil

icon Re: Problem sa update sqlce baze11.06.2010. u 13:02 - pre 168 meseci
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);
 
 
Odgovor na temu

wex-alpha
Sarajevo

Član broj: 7580
Poruke: 845
..to512.806592-163.bih.net.ba.



+13 Profil

icon Re: Problem sa update sqlce baze11.06.2010. u 13:14 - pre 168 meseci
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 :)
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Problem sa update sqlce baze11.06.2010. u 16:22 - pre 168 meseci
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.




 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.nsinfo.co.rs.

Jabber: DarkMan


Profil

icon Re: Problem sa update sqlce baze14.06.2010. u 10:08 - pre 168 meseci
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).

 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Problem sa update sqlce baze14.06.2010. u 14:04 - pre 168 meseci
DarkMan je u pravu. Ko mi je kriv kad se mesam u ono sto ne umem da radim (.NET) Izvinjavam se za zabunu.

 
Odgovor na temu

[es] :: MS SQL :: Problem sa update sqlce baze

[ Pregleda: 3162 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

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