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

[C#] prikazivanje rezultata agregacione tabele

[es] :: .NET :: .NET Desktop razvoj :: [C#] prikazivanje rezultata agregacione tabele

[ Pregleda: 2547 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.jugopetrol.co.yu

Sajt: www.mika.rs


+6 Profil

icon [C#] prikazivanje rezultata agregacione tabele12.07.2004. u 07:59 - pre 188 meseci
Pozdrav svima

Problem je sledeci, alat je C# i MSSQL u kome imam tri
tabele: Magacin, MagacinRoba i Roba.

Magacin i Roba imaju kolone id i Naziv.
MagacinRoba je agregaciona tabela i ima kolone idMagacin i idRoba.

Koncept tih mojih tabela je da postoje vise magacina koji mogu da
imaju i iste artikle u sebi, zato ta agregaciona tabela
(ok, znam da ovo mozda nema veze sa realnoscu, ali
ovo je samo teoretski da skontam relacije)

Na formi sam stavio comboBox iz koga se bira magacin i listBox
koji prikazuje robu u tom magacinu.

Upit

Code:

select r.idRoba,
 r.Naziv
from Magacin m
inner join MagacinRoba mr
on m.idMagacin = mr.idMagacin
inner join Roba r
on mr.idRoba = r.idRoba
where m.idMagacin = @BrojMagacina


vraca ono sta bi trebalo da se pojavi u listBox-u, ali kako to
da izvedem da ne moram svaki put kada se promeni SelectedValue
u comboBox-u da pozivam upit ? Zelim da kada se aplikacija ucita,
da se napuni DataSet sa tabelama i da vise ne moram da pozivam
upit. Napravio sam DataRelation, ali relacija izmedju MagacinRoba
i Roba ne funkcionise jer MagacinRoba sadrzi vise razlicitih
vrednosti idRobe za idMagacin.

Unapred hvala !
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele15.07.2004. u 11:35 - pre 188 meseci
Citat:
dusty:
Magacin i Roba imaju kolone id i Naziv.
MagacinRoba je agregaciona tabela i ima kolone idMagacin i idRoba.

Koncept tih mojih tabela je da postoje vise magacina koji mogu da
imaju i iste artikle u sebi, zato ta agregaciona tabela
(ok, znam da ovo mozda nema veze sa realnoscu, ali
ovo je samo teoretski da skontam relacije)

Tabele su ti OK, upravo i treba da imaš jednu takvu tabelu koja spaja magacine i robe (naravno, stavićeš da su ti ti ID-jevi spoljni ključevi), plus što ćeš u njoj verovatno imati i (najmanje) jedno dodatno polje - količina (date robe u datom magacinu).

Što se tiče tvog pitanja, upravo je poenta da se pri izboru drugog magacina opet "opali" upit, jer u suprotnom sve moraš da držiš u memoriji, što u jednom trenutku postane neizvodljivo (zbog obima podataka). Dakle, upite ne treba po svaku cenu da izbegavaš. Štaviše, u realnom sistemu imaćeš toliko proizvoda da korisnik ne može da se snađe - treba da razmisliš o kategorizaciji proizvoda i/ili njihovom filtriranju po imenu.
 
Odgovor na temu

Mrav
Aleksandar Mraović
.net programer u Wireless Media
Beograd

Član broj: 6532
Poruke: 279
*.smin.sezampro.yu.

ICQ: 197419540


Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele15.07.2004. u 15:38 - pre 188 meseci
DataSet je jako moćna klasa. Moguće je da preneseš kompletnu logiku tvoje baze u njega (sa sve relacijama) i da radiš u lokalu, pri čemu koristiš takozvani nekonektivni pristup (nemaš stalno otvorenu konekciju ka bazi). Ali to povlači neke probleme. Pre svega otežano održavanje konzistentnosti baze. Na primer ako se više korisnika kači na bazu i koristi nekonektivni pristup nije isključeno da će u lokalu doći do menjanja istih podataka od strane različitih korisnika, kada korisnici budu prenosili promene na bazu može doći do problema.
Drugi problem je ono što je dusty već pomenuo a to je potrebna memorija. tako da to ima smisla samo ako radiš sa određenim subsetom podataka iz baze (posebno ako baza postane glomazna). Primera radi upravnik jednog od magacina radi u lokalu sa podatcima samo za taj magacin, čime bi i izbegao probleme pri update-ovanju podataka (svaki magacioner pristupa samo određenim podacima).

Znači ako više korisnika treba konkurentno da menja isti skup podataka, konektivni pristup (upit za svaku operaciju) je najbolje rešenje.
Lepota je u jednostavnosti.

Cis.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.ptt.yu

Sajt: www.mika.rs


+6 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele17.07.2004. u 20:35 - pre 188 meseci
Hvala puno obojci na odgovorima
Ali jos nisam provalio kako da navedeni upit prenesem u C#

Citat:

Što se tiče tvog pitanja, upravo je poenta da se pri izboru drugog magacina opet "opali" upit, jer u suprotnom sve moraš da držiš u memoriji, što u jednom trenutku postane neizvodljivo


Da, za neku realnu aplikaciju, ovo je samo eksperiment Inace, sa ovim pristupom (da se opali upit) desava se nesto cudno ! Naime, prvi put pozovem .Fill() metod u konstruktoru forme, a svaki sledeci put na eventu combobox-a _SelectedValueChanged. Prvi put kada promenim selekciju u combobox-u tj. kad se drugi put pozove .Fill() metod, aplikacija se zakoci na par sekundi. Posle toga svaki put ide glatko. Iz debagovanja sam video da je konekcija otvorena (pomislio sam da je mozda zatvorio konekciju u medjuvremenu), a iz SQL profilera da je izvrsio stored proceduru koja puni tu agregaciou tabelu. Izgleda kao da je problem u SqlDataAdapteru ?! Da li imas neku ideju zasto se to desava ?

Citat:

DataSet je jako moćna klasa. Moguće je da preneseš kompletnu logiku tvoje baze u njega (sa sve relacijama) i da radiš u lokalu, pri čemu koristiš takozvani nekonektivni pristup


Znas li mozda kako u nekonektivnom pristupu da prebacim i identity za primarni kljuc kao sto je u bazi ?
Kada ubacim novi red u tabelu sa myDataSet.Tables["Roba"].NewRow(); on primarnom kljucu da vrednost prve sledece vrednosti. Ja uzimam vrednost primarnog kljuca i smestam je u agregacionu tabelu. Problem nastaje posle upisa u bazu. Zbog brisanja redova iz tabele, SQL server nece dodeliti iste vrednosti za primarni kljuc sa identity-em kao sto je C#. Tako ce idRoba u C# imati vrednosti recimo 90, 91, 92, a u bazi ce biti upisano 90, 103,104, jer sam izbrisao redove od 91 do kraja.
Resio sam problem tako sto sam napisao stored proceduru koja to obavlja, ali se nadam da se to moze zavrsiti i direktno u C#-u ?!
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

Mrav
Aleksandar Mraović
.net programer u Wireless Media
Beograd

Član broj: 6532
Poruke: 279
195.252.80.*

ICQ: 197419540


Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele17.07.2004. u 23:21 - pre 188 meseci
Da sada ne dužim da ja objašnjavam stvari, evo rešenja iz dokumentacije za .net.
Ukratko definišeš stored proceduru na serveru koja služi za insert redova a vraća novu identity vrednost i tu proceduru koristiš kao insert komandu data adaptera a koja ima output parametar i kao SourceColumn kolonu koja je primarni ključ u dataset-u

Citat:
The following stored procedure and code example show how to map the auto-incremented identity value from a Microsoft SQL Server table back to its corresponding column in a row added to a table in a DataSet. The stored procedure is used to insert a new row into the Categories table of the Northwind database and to return the identity value returned from SCOPE_IDENTITY() as an output parameter.

CREATE PROCEDURE InsertCategory
@CategoryName nchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = SCOPE_IDENTITY()

The InsertCategory stored procedure can then be specified as the source of the DataAdapter.InsertCommand. A parameter is created to receive the identity output parameter. That parameter has a Direction of ParameterDirection.Output, and has a SourceColumn specified as the CategoryID column of the local Categories table in the DataSet. When the InsertCommand is processed for an added row, the auto-incremented identity value is returned as this output parameter and is placed in the CategoryID column of the current row.

The following code example shows how to return the auto-incremented value as the output parameter and specify it as the source value for the CategoryID column in the DataSet.


[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");

SqlDataAdapter catDA = new SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn);

catDA.InsertCommand = new SqlCommand("InsertCategory", nwindConn);
catDA.InsertCommand.CommandType = CommandType.StoredProcedure;

catDA.InsertCommand.Parameters.Add("@CategoryName", SqlDbType.NChar, 15, "CategoryName");

SqlParameter myParm = catDA.InsertCommand.Parameters.Add("@Identity", SqlDbType.Int, 0, "CategoryID");
myParm.Direction = ParameterDirection.Output;

nwindConn.Open();

DataSet catDS = new DataSet();
catDA.Fill(catDS, "Categories");

DataRow newRow = catDS.Tables["Categories"].NewRow();
newRow["CategoryName"] = "New Category";
catDS.Tables["Categories"].Rows.Add(newRow);

catDA.Update(catDS, "Categories");

nwindConn.Close();


Ukoliko ti treba i za access, stvar je nešto drugačija i naći ćeš kompletnu verziju ovog teksta ako potražiš "Retrieving Identity or Autonumber Values" u .net dokumentaciji, ali za Sql sam izdvojio ono što ti je realno potrebno da bi napravio da cela stvar radi.
Lepota je u jednostavnosti.

Cis.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.ptt.yu

Sajt: www.mika.rs


+6 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele18.07.2004. u 16:42 - pre 188 meseci
Nesto slicno sam i napravio, samo sto sam koristio 'return @@identity' posle dodavanja novog reda i hvatam povratnu vrednost stored procedure.

Ali taj pristup mi se nesvidja ni malo U bazi na SQL serveru treba da budi samo 'zivi' podaci koji ce koristiti, a na klijentu podaci koji se jos uvek obradjuju. Sta ako korisnik odluci da ne snima te podatke ? Kada je u DataSet-u mogu da pozovem .RejectChanges() za te tabele i da vratim ne stanje pre izmena & dopuna, ali onda nemam stvarni identity kada budem morao updateujem bazu. To je ono sto jos ne mogu da prokljuvim

Mora da postoji caka, nemoguce da su takvu stvar propustili .....
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele18.07.2004. u 17:18 - pre 188 meseci
@@IDENTITY se baš i koristi na SQL Serveru za čitanje vrednosti identity polja, nema potrebe biti skeptičan prema istom. Vrednost je vidljiva samo u okviru konekcije tako da nema bojazni od toga da će neko drugi da utiče na tu vrednost.

Nova vrednost identity polja se čita samo nakon insert-a, a prilikom apdejta polja tu vrednost već imaš, kada si čitao podatke. Dakle, nema bojazni da će ova vrednost biti izmenjena --- ona se "upiše" samo jednom (prilikom INSERTa) i ne menja se kasnije. Zašto bi je i menjao?
Commercial-Free !!!
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.jugopetrol.co.yu

Sajt: www.mika.rs


+6 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele19.07.2004. u 09:08 - pre 188 meseci
Citat:

Nova vrednost identity polja se čita samo nakon insert-a, a prilikom apdejta polja tu vrednost već imaš, kada si čitao podatke. Dakle, nema bojazni da će ova vrednost biti izmenjena --- ona se "upiše" samo jednom (prilikom INSERTa) i ne menja se kasnije. Zašto bi je i menjao?


Nisam ni sumnjao u @@identity nego se nismo razumeli. Necu ja da menjam identity, nego kolona sa auto-increment identity-jem u tabeli na sql serveru nece imati istu vrednost kao ta ista kolona u tabeli iz DataSet-a kada insertujem novi red.
Ako sam izbrisao par poslednjih redova u tabeli na SQL serveru, nakon insert-a, vrednost tog polja sa identity-je ce biti kao da ti poslednji redovi nisu ni brisani + identity increment. Npr. posle brisanja poslednja dva reda, posledne identity polje ima vrednost 169, a nakon insert-a sledeca vrednost je 172.

E, kod C# nije tako, nego nakon ubacivanja novog reda sa .NewRow() vrednost je 170 !!! To dodje na svoje posle .Update()-a u bazu, ali ona agregaciona tabela sa pocetka price ce imati pogresne vrednosti upisane. _To_ je moj problem

Pheew, crko'h od ovolikog pisanja Nadam se da smo se sada razumeli Mada sam odlutao od prvobitno postavljenog pitanja.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.jugopetrol.co.yu

Sajt: www.mika.rs


+6 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele22.07.2004. u 09:58 - pre 188 meseci
Ok, ako nekog zanima resio sam problem sa identity-jem, a da baza ostane connection-less. Nije bas idealno resenje, ali radi: u bazi postavim da je kolona sa primarnim kljucem _samo_ unique identifier, bez autoinkrementa, a iz mog koda za svaki insertovan red pravim GUID, koji ubacujem i u agregacionu tabelu sa :

Code:
Guid myGuid = System.Guid.NewGuid();


Ubacio sam nekih stotinak redova i do sada se nije GUID ponovio, sto mu je valjda i posao
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: [C#] prikazivanje rezultata agregacione tabele22.07.2004. u 12:11 - pre 188 meseci
Citat:
dusty: Ok, ako nekog zanima resio sam problem sa identity-jem, a da baza ostane connection-less. Nije bas idealno resenje, ali radi: u bazi postavim da je kolona sa primarnim kljucem _samo_ unique identifier

To rešenje ti je sasvim OK. Mi isto tako radimo u firmi, svi ključevi su Guidi. Jeste malo neudobnije raditi s njima (pogotovo u Query Analyzeru), ali čovek se navikne.

Uzgred, u VS-u, u meniju Tools postoji alat Create Guid, kad zatreba ručno kreiranje.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: [C#] prikazivanje rezultata agregacione tabele

[ Pregleda: 2547 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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