Avatar billede kongen72 Nybegynder
20. oktober 2009 - 13:23 Der er 11 kommentarer og
1 løsning

Data Access Layer spørgsmål

Hej,

Er igang med DAL for første gang. Har forbundet relation mellem tabellerne. Så mit spørgsmål er nu, Hvordan skal SQL koden se ud for at add Query mellem tabeller?

Tak
Avatar billede arne_v Ekspert
20. oktober 2009 - 22:44 #1
DAL med hvilken teknologi?

data set ? typed data set ? data reader ? LINQ SQL ? LINQ EF ? NHibernate ?
Avatar billede kongen72 Nybegynder
21. oktober 2009 - 00:11 #2
tak for tilbagemeldingen arne_v,

Jeg bruger DataSet!

-Går ud fra, at jeg skal lave en Query for hver action (relation)?

-hvordan skal koden se ud, hvis jeg f.eks vil forbinde 2 tabeller sammen?


tak på forhånd
Avatar billede arne_v Ekspert
21. oktober 2009 - 02:38 #3
Avatar billede kongen72 Nybegynder
21. oktober 2009 - 08:46 #4
Er mere på udkig efter SQL queries, som skal tilføjes TableAdapter
Avatar billede arne_v Ekspert
22. oktober 2009 - 00:15 #5
Du kan godt lave en join i den SELECT som du loader data med.

Men du får problemer med opdateringer af data!
Avatar billede kza Nybegynder
22. oktober 2009 - 00:50 #6
Som udgangspunkt er det ikke nødvendigt selv at skrive SQL queries, når du arbejder med DataSet'et.

Case:
Du har en Master tabel og en Child tabel, men en relation på MasterID kolonnen.

Du loader hele Master tabellen under opstart med MasterTabeleAdapter.Fill(ds.Master).

Du vil loade rækker fra Child tabellen for en Master-række ad gangen, efterhånden som du får brug for dem:

Brug Add Query... på Child tabellen i DataSet designeren.
Sæt kryds ved Use SQL Statement + SELECT which returns rows.

Brug 'Query Builder' for at lave SQL'en:
  Tilføj "= @ChildID" i Filter kolonner i 'ChildID' rækken.
Du har nu lavet en SELECT, der tager en parameter.

Til sidst siger du, at du vil have to metoder, der hedder
    FillByChildID og
    GetDataByChildID

Du kan nu loade rækkerne i Child for en specifik Master-række ved at kalde

ChildTableAdapter.FillByChildID(ds.Child, masterID);


Hvis det er et andet sted, du er på vej hen, så må de forklare det lidt nærmere.

/Klaus
Avatar billede kongen72 Nybegynder
22. oktober 2009 - 10:45 #7
Hej klaus, vi er i samme retning! :-)

Skal alle mine tableadapters se således ud:


Taget ud fra vores case:

Fill,GetMaster()
FillByMasterID,GetDataMasterID(@MasterID)

Fill,GetChild()
FillByChildID,GetDataChildID(@ChildID)



Hvis jeg laver dette nummer ved alle mine tableadapters. Vil jeg så have dækket alle mine behov???

Såsom at hente data på kryds og tværs af tabellerne.
Nogle af mine tabeller skal man kunne indsætte, opdater og slette data.
Avatar billede kza Nybegynder
22. oktober 2009 - 11:40 #8
Jeg har faktisk skrevet noget vrøvl i mit tidligere indlæg.
Det jeg ville have skrevet var:

Brug Add Query... på Child tabellen i DataSet designeren.
Sæt kryds ved Use SQL Statement + SELECT which returns rows.

Brug 'Query Builder' for at lave SQL'en:
  Tilføj "= @MasterID" i Filter kolonner i 'MasterID' rækken.
Du har nu lavet en SELECT, der tager en parameter.

Til sidst siger du, at du vil have to metoder, der hedder
    FillByMasterID og
    GetDataByMasterID

Du kan nu loade rækkerne i Child for en specifik Master-række ved at kalde

ChildTableAdapter.FillByMasterID(ds.Child, masterID);


Her henter du rækkerne i Child, der er knyttet til en række i Master.
FillByChildID, jeg lavede i min tidligere kommentar, kan bruges, hvis du på en eller anden både står med et ChildID, og bare vil have load'ed denne ene række:
ChildTableAdapter.FillByChildID(ds.Child, childID);
I praksis vil det nok ikke ske så tit.

Jeg kan ikke fortælle dig, hvilke Querys du har brug for på dine TableAdaptere. Det kommer an på, hvordan du har behov for at tilgå dine data.

Faktisk kan du nøjes med at sige (i eksemplet):

ExampleDataSet ds = new ExampleDataSet();
MasterTableAdapter.Fill(ds.Master);
ChildTableAdapter.Fill(ds.Child);

... du får nu load'ed alle data i begge tabeller ind i hukommelsen i din klient.

Men hvis du kun har brug for data for en enkelt Master, vil det selvfølgelig være mere effektivt at sige:
MasterTableAdapter.FillByMasterID(ds.Master, masterID);
ChildTableAdapter.FillByMasterID(ds.Child, masterID);
ThirdTableTableAdapter.FillByPeriode(ds.ThirdTable, fromDate, toDate);

... hvor jeg har tilføjet, at du er i gang med en operation, hvor du også har brug for data fra en tredje table, der falder indenfor en periode.

Tænk lidt over, hvordan du har brug for at tilgå data og tilføj de Queries. Du kan så tilføje flere, når du får brug for det, ifm. at du implementerer din funktionalitet.


Når du bruger et Typed Dataset, behøver du normalt ikke at bekymre dig om INSERT, UPDATE og DELETE. Medmindre at du gør noget usædvanligt eller får brug for at optimere.

Når du laver et Typed Dataset er Visual Studio så venlig, at autogenererer flere tusind linier kode for dig, og deribland en TableAdapterManager.

Efter at du har indsat, ændret og slettet data i dit DataSet, kan du sige:

using ExampleDataSetTableAdapters;

TableAdapterManager mng = new TableAdapterManager();
mng.MasterTableAdapter = new MasterTableAdapter();
mng.ChildTableAdapter = new ChildTableAdapter();

mng.UpdateAll(ds);
ds.AccepChanges();


/Klaus
Avatar billede kongen72 Nybegynder
22. oktober 2009 - 12:53 #9
tak Klaus..

Problemet ligger nu i, hvordan jeg laver disse queries, som jeg har behov for!

Har du nogle forslag? hjemmsider? tutorials eller noget?
Avatar billede kza Nybegynder
23. oktober 2009 - 11:15 #10
Kan du noget basal SQL allerede?
Ellers er det nok der, du skal starte.

/Klaus
Avatar billede kongen72 Nybegynder
23. oktober 2009 - 14:14 #11
svar! og tak for hjælpen! :-)
Avatar billede kza Nybegynder
23. oktober 2009 - 16:26 #12
Et Svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester