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

ADO problem sa upisom i brisanjem iz baze

[es] :: Visual Basic 6 :: ADO problem sa upisom i brisanjem iz baze

[ Pregleda: 1946 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon ADO problem sa upisom i brisanjem iz baze21.03.2010. u 10:56 - pre 170 meseci
s vremena na vreme desava mi se da dobijem sledecu gresku:

Row cannot be located for updating. Some values may have been changed since it was last read.

Obicno se desava ako imam punu upisa u bazu u kratkom vremenu (npr kroz for petlju) ili npr ako brisem puno zapisa kroz for petlju. A ako stavim break i prolazim kroz program tako da se brisanje ne odvija "brzo" tj. u kratkom vremenu onda ne dolazi do greske. U cemu gresim?

Primer brisanja

For i=1 to adodc1.Recordset.Recordcount
Adodc1.Recordset.Delete
Next i

[Ovu poruku je menjao Blue82 dana 21.03.2010. u 12:25 GMT+1]
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze21.03.2010. u 12:08 - pre 170 meseci
Pa ti uopšte ne pomeraš red, nego uvek brišeš tekući. Tako da, verovatno u nekom trenutku naredni red ne stigne da postane tekući, pa pokušavaš da obrišeš nepostojeći, što naravno dovodi do greške. Inače brisanje ni ne bi trebalo tako da se radi, osim ako ne brišeš samo jedan red. Za brisanje više redova je bolje koristiti query. Brže je i sigurnije
Code:
DELETE * FROM ImeTabele

ili recimo ako nećeš da obrišeš sve redove u tabeli, nego samo neke, dodaj uslove klazulom WHERE. Na primer
Code:
DELETE * FROM ImeTabele WHERE ImePolja BETWEEN 1 AND 10

-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze21.03.2010. u 14:52 - pre 170 meseci
Pomeram ih hehe ovo sam samo uprostio. Naime ne znam sve da kuckam sto se tice ADO-a pa koristim njegovu ugradjenu funkciju iz VB-ove liste. Stavim ado kontrolu na formu i onda ide nesto kao ovo...
(znam da se tako ne radi jer samo usporavam bazu ali bolji nacin mi je prekomplikovan). Da bi se ta kontrola aktivirala verovatno postoji bolje resenje ali posto ga ne znam otkrio sam da stavim textbox za svaki zapis iz tabele i u propertiju ga povezem sa ADO kontrolom i sakrijem taj textbox. Kako se krecem kroz bazu tako se te vrednosti ocitavaju u textboxu i ja ih citam.
Code:

for i=1 to adodc1.recordset.recordcount
datum=datevalue(text1.text)
if datum<="12.02.2010" then adodc1.recordset.delete
adodc1.recordset.movenext
next i

Evo ovako izgleda taj nakaradni primer i sasvim me je lepo sluzio do sada dok mi nije trebalo puno podataka uneti vecom brzinom ili ih puno obrisati.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze21.03.2010. u 16:50 - pre 170 meseci
Mnogo si ti to zakomplikovao :) Probaj ovako
Code:
Adodc1.RecordSource = "SELECT * FROM ImeTabele WHERE datum <= #2/12/2010#"
Adodc1.Refresh

Do Until Adodc1.Recordset.EOF
    DoEvents
    Adodc1.Recordset.MoveFirst
    If Adodc1.Recordset.EOF Then Exit Do
    Adodc1.Recordset.Delete
Loop

-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-6.sezampro.rs.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze22.03.2010. u 05:30 - pre 170 meseci
E majstore, nisam stigao da isprobam ali nije mi to bas najjasnije.
Prvo selektujem odredjenu tabelu i trazim u njoj sve zapise sa odredjenim datumom, pa tek onda osvezavam bazu? To mi je nelogicno jer vec sam pronasao zapise jel da? A onda on ih je kao nasao a ja se opet krecem kroz bazu sa MoveFirst tj idem na pocetak i kao nesto brisem, sta brisem? Razumes sta ne razumem? hehe
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze22.03.2010. u 06:50 - pre 170 meseci
Poenta je da napraviš recordset koji sadrži samo one podatke koje želiš da obrišeš i onda jednostavno prođeš kroz taj recordset i brišeš redom, umesto da otvaraš kompletan recordset, pa onda u petlji proveravaš uslov kao što ti radiš. Prvo što je to mnogo sporije, a drugo, što je sklono greškama, kao što si već primetio. To je posebno uočljivo u tvom primeru gde koristiš bindovani textbox za upoređivanje uslova, jer da bi se taj textbox apdejtovao tekućim redom, ipak je potrebno neko vreme, koje se povećava kako ima više podataka u bazi, a petlja neće da čeka da se taj textbox apdejtuje, nego će da piči po svom. Upravo to je i najverovatniji razlog zašto dobijaš grešku kada imaš više podataka, jer se petlja izvršava jako brzo i u nekom trenutku textbox ne uspe da se apdejtuje na vreme i onda dobijaš pogrešnu vrednost u promenljivoj datum, što dovodi do toga da uslov bude ispunjen čak i kada on nije ispunjen ili ne postoji red tamo gde ti je trenutno pokazivač, a ti pokušavaš da obrišeš taj red. Dakle, to su i osnovna dva problema u tvom kodu, može da se desi da obrišeš podatak koji nisi hteo da obrišeš, a drugo može da se desi da pokušaš da obrišeš prazan red što dovodi do greške.

U mom primeru, prvo se otvara recordset koji sadrži samo one podatke koje želiš da obrišeš (u konkretnom slučaju sve redove gde je datum manji ili jednako 12.02.2010). Time se osiguravaš da neće biti obrisan neki podatak koji ne želiš da bude obrisan, jer se neće ni naći u recordset-u. Zatim, pokrećeš petlju koja prvo odabira prvi postojeći red u otvorenom recordset-u. Zašto prvi ? Bez nekog posebnog razloga. Možeš da staviš i da ide na poslednji (samo umesto MoveFirst, staviš MoveLast). Poenta ovoga je da se osiguraš da će se pokazivač nalaziti iznad nekog podatka kada pokušaš brisanje. Naime, kada obrišeš neki podatak, ispod pokazivača ostaje prazan red i ako pokušaš da ga obrišeš dobićeš grešku. Ti si to pokušao da rešiš sa MoveNext, što takođe može da radi, ali MoveNext može dovesti pokazivač na EOF (to je ono što ide posle poslednjeg podatka u recortdset-u), čak i kada još uvek ima podataka u recordset-u koje želiš da obrišeš i onda se može desiti da izađeš iz petlje, a nisi pobrisao sve što si želeo. U stvari, ima i za to rešenje, proveravaš i EOF i BOF (to je ono što ide pre prvog podatka u recordset-u) i ako su oba True, onda nema više podataka u recordset-u, ali to samo bespotrebno komplikuje stvari. Sa MoveFirst ili MoveLast se osiguravaš da će pokazivač uvek biti iznad nekog podatka, sve dok ima podataka u recordset-u i onda kada očitaš EOF, znaš da su svi podaci u recordset-u obrisani. Linija If Adodc1.Recordset.EOF Then Exit Do služi upravo za to, kada se detektuje EOF, čak i posle pozivanja MoveFirst, to znači da nema više podataka u zadatom recordset-u i napuštamo petlju.

Da uprostimo, ono tvoje će u dosta slučajeva da radi, ali je problem što ideš kroz petlju "kao muva bez glave" da se tako izrazim, bez ikakvih provera, pa tako ako se zvezde poklope (tj. textbox uspe da se apdejtuje na vreme), sve će biti uredu, međutim ako apdejt izostane, a petlja nastavi da radi, može se desiti da se obriše nešto što nisi želeo ili da se pokuša brisanje praznog reda i to će naravno javiti grešku, što se tebi i dešava čim imaš više redova. U mom primeru postoji više mera zaštite. Prvo je kreiranje recordseta koji sadrži samo podatke koje zaista želimo da obrišemo čime se eliminiše mogućnost da se obriše neki podatak koji nismo hteli da obrišemo. Drugo, koristimo MoveFirst pre brisanja što eliminiše mogućnost da se u trenutku brisanja pokazivač nađe iznad praznog podatka, tj. reda. I treće, proveravamo EOF, što nam omogućava da pre nego što napustimo petlju budemo sigurni da smo obrisali sve podatke koje smo želeli da obrišemo. Naravno, ja ti i dalje predlažem da se baciš na detaljnije proučavanje rada sa bazama (imaš dosta tutorijala po netu, ali i na ovom forumu) i da ovakve stvari rešavaš korišćenjem query-ja, pa bi u konkretnom slučaju sve završio jednim SQL upitom tipa
Code:
DELETE * FROM ImeTabele WHERE datum <= #2/12/2010#

jer je to em mnogo brže, em će raditi i ako nemaš nijedan podatak koji ispunjava uslov, em se ne bakćeš sa petljama.

Kod programiranja je inače jako bitno izbeći (koliko god je to moguće) situaciju da tok izvršavanja neke procedure zavisi od rasporeda zvezda i time dovede do nepredviđenih rezultata, pa samim tim i raznoraznih grešaka. Zato je potrebno u kodu imati razne provere, a pre tih provera, koliko god je to moguće, eliminisati sve ono što može dovesti do problema, kao što smo u konkretnom slučaju pre bilo kakvih provera, eliminisali iz recordset-a sve redove koje ne želimo da obrišemo. Recimo, banalan primer, u programiranju se često se javlja potreba da se saberu vrednosti dva ili više polja (na primer iz textboxa). Neki bi to uradili ovako
Code:
rezultat = Text1.Text + Text2.Text
MsgBox rezultat

što će samo po sebi dati ispravan rezultat u nekim slučajevima, ali pošto nema nikakvih dodatnih provera, vrlo lako može doći do raznoraznih grešaka, prvo zato što nismo definisali tip podatka za promenljivu rezultat, a drugo zato što je Text svojstvo Textbox-a ipak string tipa, pa je moguće upisati svašta, pa se može dobiti Type Mismatch i slično. Dakle, mnogo je bolje uraditi ovako
Code:
Dim rezultat As Long 'ako se radi o celobrojnoj vrednosti naravno
rezultat = Val(Text1.Text) + Val(Text2.Text)
MsgBox rezultat

što će u svakom slučaju vratiti neku vrednost bez izbacivanja greške. Međutim, opet može doći do neželjenih rezultata, jer ako neko upiše u Textbox "t654" gde je slovo t greškom zakačeno prilikom unosa, Val će vrednost tog textbox-a konvertovati u 0, pa će se dobiti pogrešan rezultat, a ako onaj ko je to unosio nije pazio i primetio to na vreme, može doći do kasnijih problema, zavisno već od toga za šta se dobijeni rezultat upotrebljava. Pa tako, ne bi bilo loše uvesti dodatne provere da li je uneta vrednost numeričkog tipa.
Code:
Dim rezultat As Long 'ako se radi o celobrojnoj vrednosti naravno
If IsNumeric(Text1.Text) And IsNumeric(Text2.Text) Then
   rezultat = Val(Text1.Text) + Val(Text2.Text)
Else
   Msgbox "Jedna od vrednosti koju ste uneli nije numerickog tipa.", vbCritical, "Greska"
   Exit Sub
End If
MsgBox rezultat

Sve ovo su provere, a naravno, najbolja solucija jeste potpuno eliminisati, tj. zabraniti unos nenumeričkih podataka u textbox, što se može postići korišćenjem KeyPress event-a i setovanjem KeyAscii na 0 ukoliko se ne radi o numeričkoj vrednosti, no nećemo se sada baviti time (ukoliko nekome treba, ostavljao sam negde na forumu kod i za to).

U svakom slučaju, izvinjavam se ako sam udavio sa ovim tekstom, ali eto, možda nekom koristi :)

[Ovu poruku je menjao Marko_L dana 22.03.2010. u 08:09 GMT+1]
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.yu.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze22.03.2010. u 18:07 - pre 170 meseci
Ok, ubedio si me :)
Hajde sada ovako, jos 2 primera. Kako da pronadjem sve zapise koji u sebi sadrze odredjeni string.
Znaci u tabeli korisnici, pronadji sve korisnike koji sadrze string "abc" i da ih ispisem npr sa msgbox (resenje).

I drugo, ako sam pronasao te korisnike da u njihov rekordset ubacim npr neki broj. To je ono sto se da kazem najviise koristi. Pronadji i ispisi ili pronadji i promeni nesto u njegovom redu. Da vidim tvoj fazon posto i kod brzog upisa podataka nekad dodje do iste greske kao i kod brisanja.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.yu.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze22.03.2010. u 19:57 - pre 170 meseci
E, druze nemoj da se trudis. Nije to za mene. DA bih to shvatio morao bih da zaboravim sve sto znam o programiranju jer logika je sva naopaka :) Ovo ne radi u mom primeru preko te ado kontrole, verovatno radi samo ako se sve pise rucno ali to je svemir za mene. Gledao sam neke primere i nemaju veze sa mozgom (mojim, naravno :) tako da nemoj trositi vreme, vidim da se bas zadubis da objasnis a nema puno logike. Jasno je ovo sto napises ali ado je vise od jednog reda a ako ja ne umem da izcitam jedan zapis onda nema tu leba. Hvala ti za trud.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-2.sezampro.yu.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze22.03.2010. u 20:57 - pre 170 meseci
Hehe malopre sam se iznervirao, htedoh lupiti i po monitoru, pa me proslo, pa proradio inat i sad sam se zadubio i shvatio. Mislim da sam skontao vecinu onoga sto mi treba osim tog dela, kako napraviti upit da pronadje sve zapise koji sadrze odredjeni deo stringa?
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.isp.telekom.rs.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze23.03.2010. u 15:03 - pre 170 meseci
Zar je moguce da niko ne zna da napravi upit da pokaze sve zapise koji u sebi sadrze neki string? Znaci imamo Eleonora u bazi i kada vrsimo pretragu npr ukucamo samo onora ili ora ili ele ili bilo koju drugu kombinaciju da on pokaze zapise koji sadrze ta slova. Ako i dalje nije jasno, npr primena u telefonskom imeniku. Pronaci sva imena koja sadrze u sebi neki string.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze23.03.2010. u 15:24 - pre 170 meseci
Code:
SELECT * FROM ImeTabele WHERE ImePolja LIKE '%ele%'

-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.isp.telekom.rs.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze23.03.2010. u 15:55 - pre 170 meseci
Hvala, to mi je trebalo.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-4.sezampro.yu.



+322 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze23.03.2010. u 18:51 - pre 170 meseci
Sada imam novi problem. Pretraga kao pretraga radi ok ako programski upisem sta trazim ali ako hocu da string za pretragu ucitam iz promenjive eto problema

Code:
     rsRecordSet.Open "SELECT * FROM Kompenzacije WHERE Ucesnik1 LIKE " & "'%" & sta_trazim & "%" & "'", Cn, adOpenStatic, adLockOptimistic



Znaci ucitavam iz promenjive sta_trazim string za pretragu. Ali ako imam vise kolona u bazi koje pretrazujem dolazi do greske posto VB moj karakter ' shvati kao pisanje komentara i sve posle njega se ne izvrsava.

Code:

rsRecordSet.Open "SELECT * FROM Kompenzacije WHERE Ucesnik1 LIKE " & "'%" & sta_trazim & "%" & "'" OR Ucesnik2 LIKE " & "'%" & sta_trazim & "%" & "'", Cn, adOpenStatic, adLockOptimistic


Ovaj deo teksta ce program skontati kao REM (komentar) zbog znaka '

rsRecordSet.Open "SELECT * FROM Kompenzacije WHERE Ucesnik1 LIKE " & "'%" & sta_trazim & "%" & "'" OR Ucesnik2 LIKE " & "'%" & sta_trazim & "%" & "'", Cn, adOpenStatic, adLockOptimistic


Kako to resiti, probao sam da ubacujem i chr$(x) gde je x broj za taj znak ali nece ni tako.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: ADO problem sa upisom i brisanjem iz baze23.03.2010. u 19:28 - pre 170 meseci
Ne moraš svaki put stavljati apostrof pod navodnike. Navodnike koristi samo onda kada razdvajaš query od ostatka koda, tj. tamo gde ubacuješ varijablu. Ovako bi trebalo da radi
Code:
rsRecordSet.Open "SELECT * FROM Kompenzacije WHERE Ucesnik1 LIKE '%" & sta_trazim & "%' Or Ucesnik2 Like '%" & sta_trazim & "%'", Cn, adOpenStatic, adLockOptimistic

-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

[es] :: Visual Basic 6 :: ADO problem sa upisom i brisanjem iz baze

[ Pregleda: 1946 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

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