[ nristic @ 16.08.2003. 16:12 ] @
Sve sam knjige pretražio i cjelu net sdk dokumentaciju i ne mogu
ovo naći.

Kako pomoću oledbdatareader-a napisati redni broj
zapisa u bazi podataka.

Znači kao što u klasičnom asp-u ima absoluteposition.

[ dotnet @ 16.08.2003. 17:07 ] @
Pozdrav

Nisam siguran, ali mislim da sa DataReader-om to nije moguće.

Šta tebi konkretno treba?
[ nristic @ 16.08.2003. 20:00 ] @
Ništa posebno .Ispisati polja iz baze a pored njih napisati redne brojeve.
[ Acid @ 26.08.2003. 20:32 ] @
ako sam dobro razumeo onda ti ovo treba (moras imati dataadapter i dataconection i datacommand)

Code:

dataconection.open
dim dr as system.data.oledb.oledbdatareader=datacommand.executereader
dim i as integer = 0
while dr.read
   'ovde nisam siguran sta zelis ali probaj sa dr.get...(ime kolone)
   i+=1
end while
dataconection.close
[ Deep|Blue @ 26.08.2003. 23:52 ] @
a da dodas jos jednu kolonu za redni broj u select naredbi pomocu koje vuces podatke u readeru?
[ degojs @ 27.08.2003. 09:02 ] @
Kreiraj view (MS SQL Server) ili query (MS Access) i u njemu dodaj dodatnu kolonu koja će davati redni broj zapisa (rownum u Oracle). Podatke iz tog objekta kasnije čitaj običnim SELECT. Ako se radi o Access bazi detalje potraži na VB/ASP forumu - nedavno smo imali baš taj problem (za pretregu koristi ime korisnika: bboris).

Pozdrav
[ nristic @ 31.08.2003. 21:39 ] @
To neće valjati jer kad se obriše zapis iz baze neće ići redom brojevi.
Pokušavam pronaći onaj post od bboris ali ga ne mogu naći.
Hvala

Citat:
Deep|Blue:
a da dodas jos jednu kolonu za redni broj u select naredbi pomocu koje vuces podatke u readeru?

[ degojs @ 01.09.2003. 00:06 ] @
Primeti da se kolona može dodati u view/query, a ne samo tabelu, tako da ovo gore što si rekao ne stoji. Ta dodatna kolona ne bi mapirala direktno neku kolonu iz tabele.

Što se pretrage tiče, korisničko ime je malo drugačije: bobiris, moja greška.

U svakom slučaju ako se radi o Accessu rešenje je, kako rekoh, već odrađeno na ovoj temi: http://www.elitesecurity.org/tema/25682

Pozdrav.
[ nristic @ 01.09.2003. 20:19 ] @
Hvala na linku ali mi nije bas puno pomoglo.Vjerojatno nisam skužio
ali činjenica je da u acessu znam napraviti tablice i query.Inače mi
samo to i treba.

Meni treba sljedeće.Pokušat ću što detaljnije napisati.

1.Pretpostavimo da imamo tablicu sa tri kolone korisnik_id,ime,
prezime gdje je korisnik_id polje tipa autonumber.

2.Pretpostavimo da se nalazi 100 zapisa u bazi.

3.Obrišemo li 10 zapisa npr pod rednim brojevima 1,11,25 itd.
Nije bitno kpji su brojevi.

4.Sada u bazi ima 90 zapisa koji ne idu po redu.Znači ako smo obrisali
redne brojeve od 1 do 10 bit će prvi broj 11.

5.Na asp.net stranici vršimo sortiranje po 10 zapisa po stranici.
Radimo custom paging po principu 1 stranica 10 zapisa ,2 stranica sljedećih
10 zapisa.Znači imamo stranicu tipa default.aspx?stranice=1 itd.

6.Na temelju broja stranice vršimo upit u bazu tipa
SELECT * FROM tablica WHERE id > broj1 AND id<broj2

7.Problem nastaje ovdje jer on zapise koji su obrisani prikaže
praznu stranicu.U mom primjeru prikaže 10 stranica iako ima 90 zapisa što znači
da na nekim stranicama ima 9 zapisa na nekima 10 .

8.Sad meni treba kreirati isto takvu tablicu s privremenom kolonom koju
mogu koristiti za ispis na stranici.

Ja sam isprobavao nešto sa onim primjerom koji je neki član stavio ali ništa.

Nadam se da sam bio detaljan i molio bih vas da mi
pomognete jer se več nekoliko dana bavim ovim.
[ dotnet @ 01.09.2003. 21:32 ] @
Pozdrav

probaj nesto tipa:
Code:
select count(*) AS SlNo,a1.companyname,a1.contactname,a1.contacttitle from customers a1,customers a2
where a1.companyname + a1.contactname + a1.contacttitle >= a2.companyname + a2.contactname + a2.contacttitle
group by a1.companyname,a1.contactname,a1.contacttitle
order by 1


Primer je vezan za Customers tabelu iz Northwind baze.
Objasnjenje i primer na http://www.devcity.net/forums/...p;cat=SQL+Server&#TID24434
[ degojs @ 01.09.2003. 21:35 ] @
Možeš li da upotrebiš DataSet u kombinaciji sa DataAdapter klasom umesto DataReader-a?

Naime, DataAdapter može da popunjava DataSet baš tako kako tebi treba - po stranicama. Na svakoj stranici imaš određeni broj zapisa, bez obzira na ID polje. Pogledaj u HELP-u koje sve oblike Fill metode ima DataAdapter.

Evo recimo da imaš neku bazu db1.mdb i u njoj tabelu tblAlbum.
Na formu stavi jednu DataGrid kontrolu kao i jedno dugme.

Kao članove podatke klase Form1 stavi (tako da su vidljivi u čitavoj klasi):
Code:

    Dim cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=W:\Temp\Temp\db1.mdb;"
    Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection(cnString)

    Dim SQL As String = "SELECT * FROM tblAlbum"
    Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(SQL, cn)

    Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(cmd)

    Dim ds As DataSet = New DataSet()


A potom dodaj događaj za button1_Click
Code:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    Static start As Integer = 0
        Me.ds.Tables.Clear()
        da.Fill(ds, start, 5, "tblAlbum")
        Me.DataGrid1.DataSource = ds.Tables("tblAlbum")
        Me.DataGrid1.Refresh()
        start += 5
    End Sub


Kad god klikneš na dugme, u DataGrid-u će se prikazati sledećih 5 zapisa, bez obzira na polje AutoID u tabeli: prvo 1-5, pa 6-10, pa 11-15 i na kraju 16-17 pošto u tabeli ima ukupno 17 zapisa... sve bez ikakve veze sa AutoID poljem (izbrisao sam neka polja tako da AutoID ne ide redom).

Eto :) Ako ti treba primer javi pa ću da postavim ovde i bazu i VB.NET soluciju pa vidi sam.
[ degojs @ 01.09.2003. 21:43 ] @
Mada moglo bi i nešto tipa ako se stranice listaju redom:

SELECT TOP 10 * FROM tabela WHERE korisnikID > x ORDER BY korisnikID;

Pri čemu je x vrednost ID polja poslednjeg zapisa na prethodnoj stranici.

/EDIT: degojs

Doduše čak i ovako bi moglo... npr. treba ti 12-ta stranica:

SELECT TOP 110 * FROM tabela ORDER BY korisnikID DESC;

pa vidiš koja je vrednost korisnikID za prvi zapis (pošto smo sortirali DESC), stavi to da je = x i onda upotrebiš nešto tipa:
SLECT TOP 10 * FROM tabela WHERE korisnikID > x ORDER BY korisnikID ASC;

ili

SELECT TOP 120 * FROM tabela ORDER BY korisnik_ID DESC;

pa pročitaš samo prvih 10 zapisa.


[Ovu poruku je menjao degojs dana 01.09.2003. u 19:09 GMT]
[ degojs @ 01.09.2003. 21:49 ] @
Ne znam šta ti nije jasno kod onog linka što sam ti dao?
Lepo napraviš novi query i dodaš mu jedno polje koje radi u kombinaciji sa malo VBA koda. I to polje lepo ide od 1 pa nadalje, bez obzira na AutoID polje.
Ako zatreba tamo imaš i kako da prebaciš sve to u novu tabelu (privremenu) pa tek onda nema problema da vršiš izbor iz te tabele kako god hoćeš.

Pozdrav (i pogledaj malo bolje onaj tamo primer - čoveku je trebalo baš isto to što ti tražiš i rešili smo problem)
[ degojs @ 01.09.2003. 22:17 ] @
Odnosno ako označimo:
x - broj zapisa po stranici
y - broj stranice koju želimo da vidimo
t = x*y

SELECT TOP x * FROM
(SELECT TOP t * FROM tabela ORDER BY AutoID ASC)
ORDER BY AutoID DESC

..dobićeš zapise u obrnutom redosledu, pa ih pročitaj od poslednjeg prema prvom ili:

SELECT TOP x * FROM
(SELECT TOP x * FROM
(SELECT TOP t * FROM tabela ORDER BY AutoID ASC)
ORDER BY AutoID DESC)
ORDER BY AutoID ASC;

Uh :-)

(naravno, ti kod sebe AutoID zameni sa korisnik_ID).
[ nristic @ 02.09.2003. 10:36 ] @
Hvala vam puno svima.
Napokon sam uspio i to preko dataadaptera.
Nisam imao pojma da ima to svojstvo jer u knjigama se spominju
samo 2 parametra metode fill.Ali kada sam pogledao Net SDk Help
doživio sam otkrivenje.

Uspio sam dobiti i redne brojeve pomoću datacolumn dodavajući još jednu
kolonu u datatable i jednostavnim iščitavanjem vrijednosti pomoću DataGrid kontrole.


Dugujem vam svima po rundu.
[ Zvonimir @ 02.09.2003. 15:38 ] @
Problem sa ovim DataAdapter resenjem je sto se u svakom slucaju dovlace svi podaci sa DB servera, a to nekada moze biti puno. Kod web aplikacije treba imati u vidu i broj korisnika... Evo sta kaze MSDN:
Citat:
Note The DataSet will not contain more than the number of records indicated by maxRecords. However, the entire resultset generated by the query is still returned from the server.

Obicno se paging resava tako sto se na serveru kreira privremena tabela sa Identity kolonom i prepisu primarni kljucevi. Onda se uradi select from (join privremene tabele na izvornu) where (newID >= @pageStart) AND (newID < @pageEnd) kao sto je nristic naveo pod 6. Na ovaj nacin, sa servera se dovlace samo podaci trazene stranice, a tu su i redni brojevi.

Pozdrav
[ degojs @ 02.09.2003. 15:59 ] @
I to resenje sa prepisivanjem u novu, privremenu, tabelu smo ponudili kao jedno od resenja, cak smo bas tako postupili na database forumu (doduse tamo smo prepisali komplet tabelu, sto zaista jeste bespotrebno kad je dovoljno samo prepisati primarne kljuceve, ali tabela nije bila velika pa onda..).
[ nristic @ 02.09.2003. 16:21 ] @
Da Zvonimir u pravu si.Veselje je kratko trajalo.

Evo ja sam uz ovaj post prikačio bazu sa jednom
tablicom od 3 polja.pa ako mi možeš napisati query koji će
izabrati sva imena između dva broja i prikazati redne brojeve uz query

U tablici su obrisana polja od 2 do 9.

Bazu možete skinuti ovdje http://www.titlovi.net/baza.zip
[ degojs @ 02.09.2003. 18:39 ] @
Baš smo gotovani je l' da?

Prvo, upućen si na temu u database forumu koja bukvalno radi to što ti treba. Ništa. Dalje ti je Zvonimir opet pojasnio kako i šta, al opet nije dovoljno (a rešenje koje je Zvone predložio je praktično isto kao ono na koje si dobio link - koristi se privremena tabela). Opet ništa. A sve vreme kod koji ti treba stoji i dalje u onoj temi na koju imaš link. Nije li malo bezobrazno od tebe to što radiš?

Ako će Zvonimir da ti odradi, lepo od njega.
[ Zvonimir @ 03.09.2003. 13:34 ] @
E, Dejan je stvarno sve napravio, treba smo iskopirati (ne zaboravi Module1)... Evo Access baze: http://www.elitesecurity.org/poruka/fajluzporuku/176862

Posto pretpostavljam (i nadam se) da web app radite sa SQL Serverom, evo primera kako se to moze resiti Stored Procedurom: http://www.4guysfromrolla.com/webtech/062899-1.shtml

Kao sto rekoh, ovo se moze popraviti tako sto se prepise samo primarni kljuc umesto Name i Price (dakle, u tvom slucaju korisnik_id), a treba kreirati i index bice puno brze. Jos jedna moguca popravka bi bila da se #TempItems tabela ne kreira svaki put kada se pozove SP, vec samo u slucaju da su obrisani ili dodati novi slogovi (recimo da trigger postavi neki "dirty" flag...). Posto se radi Join, kod izmene slogova ne treba da se menja #TempItems.

Mada je ovo vec tema za DB forum... Ako jos nesto nije jasno, tu smo.

Pozdrav
[ dotnet @ 03.09.2003. 17:04 ] @
Pozdrav

Zasto ne samo query:
Code:
SELECT Count(*) AS SlNo, a1.korisnik_id, a1.ime, a1.prezime
FROM [Table] AS a1, [Table] AS a2
WHERE ([a1].[korisnik_id]>=[a2].[korisnik_id])
GROUP BY a1.korisnik_id, a1.ime, a1.prezime
ORDER BY 1;
[ Zvonimir @ 04.09.2003. 09:24 ] @
Prvo, kljucevi ne moraju da budu po redu, recimo prikazujes slogove sortirane po polju "ime". Drugo, najvaznije, do par stotina slogova u tabeli mozda moze da prodje, ali za vece tabele ne, jer vreme izvrsavanja vrtoglavo raste. Ako pustim taj upit na tabeli od par desetina hiljada slogova, mogu slobodno na godisnji odmor dok se ne zavrsi. Sto i nije tako losa ideja...

Pozdrav