Avatar billede Syska Mester
06. juli 2005 - 08:40 Der er 24 kommentarer og
2 løsninger

Overskuelig opbygning af program med database

Hej,

Jeg ville høre om der ikke var nogen der ligger inde med et program opbygget omkring en database på en pæn måde.

Synes altid jeg får lavet 1000 SqlConnections.Open(); etc og tests på om det lykkedes.... og ved sådan set ikke hvordan alle andre mennesker laver det?

Så hvis der er en flink sjæl derunde med en forholdvis lille program opbygget på en smart måde så jeg kan få en god forståelse for hvordan andre laver deres strukturing, også som gør det nemt at skifte database.....

Hvis mere info ønskes, kommer jeg gerne med det, men det her burde være nok...

// ouT
Avatar billede imago-dei Nybegynder
06. juli 2005 - 09:04 #1
Jeg kan råde dig til at dele programmet op i "tiers". Tiers kan oversættes til noget der liger lag. Dvs. del programmet op i lag.

For eksempel er det ofte fornuftigt at dele et program op i 3 lag. Et lag til alt det visuelle, et til "programming logic" og et til databaseadgang. De to første får du (tilnærmelsesvis) forærende hvis du bruger Visual Studio, eller på anden måde laver code behind filer.

For at sige det lidt mere konkret: Lav en klasse, som _kun_ tager sig af adgang til databasen. ALLE kald, både select, insert, update osv. skal så gå gennem denne klasse.

Hvis du har mulighed for det, vil jeg stærkt anbefale at du bruger f.eks. Data Access Application Blocks fra Microsoft. Det letter tilgangen til databasen en hel del.
Avatar billede arne_v Ekspert
06. juli 2005 - 09:09 #2
Du laver vel en eller flere klasser til at tilgå databasen med.

Med et simpelt veldefineret interface som er uafhængigt af selve databasen
d.v.s. at det returnerer enten single objekter af en en af dine data bæreende
klasse eller en collection af objekter af samme.

Så vælger du en error strategi:
  - fang fejl og returner status koder fra dit data access lag
  - propagate exceptions fra dit data access lag til dit forretnings logik lag
  - fang exception os smid en ny egen defineret exception i dit data access lag

Det sidste er nok det pæneste.

Det er et plus hvis det er nemt at skifte database.

Du skal også tænke på sikkerhed og brug af parameters er en god ide.
Avatar billede Syska Mester
06. juli 2005 - 09:11 #3
Ja, det er også det jeg har læst et par steder, men jeg vil gerne se en konkret opbygning af det....

Nemt nok at sige det skal deles op.... :-)

Den klasse der tager sig af database klad, åbner connection, håndtere dataset, datareaders etc., inserts, updates, selects og hvad der nu ellers måtte være, må jo blive stor, og mange forskellige metoder må der vel komme til sidst....

Vil helst lære det på den rigtige måde først, i stedet for at tro at jeg gør det på den rigtige måde for så bagefter at finde ud af der er noget jeg totalt har misforstået, så derfor ville et eksemple med noget insert, update og select være fedt, for at jeg kommer til at lære det "the right way from the start"... :-)

// ouT
Avatar billede Syska Mester
06. juli 2005 - 09:15 #4
Min kommentar før var mest til imago-dei, og noget af det også til arne_v....

Men gerne et eksemple, da min hjerne ikke kan tænker så langt ud endnu, da jeg aldrig har opbygget det sådan før, men mer eller mindre tilfældigt :-P

Men jeg vil lige tanke lidt morgenmad i kroppen :-D

// ouT
Avatar billede lifo Nybegynder
06. juli 2005 - 09:22 #5
du kunne også kigge efter DAAB fra Microsoft
den simplificerer koden en hel del
Avatar billede imago-dei Nybegynder
06. juli 2005 - 09:28 #6
Ja kig på DAAB (Data Access Application Blocks). Her får du en held del forærende. For eksempel skal du her ikke tænke på at åbne connections osv. DAAB klarer alt det for dig.

Source koden følger med DAAB, så her kan du se hvordan skidtet virker under hjelmen.
Avatar billede arne_v Ekspert
06. juli 2005 - 09:31 #7
DAAB

Der er også nogle artikler på MSDN om 3 layers apps.

Fowlers bog/web-site (Domain Model, Table gateway, Row Gateway)
Avatar billede arne_v Ekspert
06. juli 2005 - 09:32 #8
Men du skal også gøre dig klart at du bliver ikke god til den slags ved at læse 10
sider - nogle ting kræver at man selv gør sig sine erfaringer.

Og der er absolut ikke enighed om hvad der er bedst.

DAAB er f.eks. absolut ikke velanset hos alle.
Avatar billede arne_v Ekspert
06. juli 2005 - 09:33 #9
generelt med hensyn til tiers og layers (som jeg ikke opfatter som det samme !)
se evt. http://www.eksperten.dk/artikler/148
Avatar billede imago-dei Nybegynder
06. juli 2005 - 09:49 #10
Nej det er altid svært at sige hvad er bedst.

Jeg kan bare sige at for mig er DAAB tilstrækkeligt i de fleste tilfælde. Man skal bare gøre sig klart, at en ulempe ved DAAB er at kun MSSQL server er understøttet. Dvs. hvis du har en anden DB kan du ikke bruge DAAB.

Læs om DAAB her: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/daab.asp

Men som arne_v siger, tag det ikke så tungt hvis du ikke får det korrekt første gang. Det kræver en forståelse for programmering, tiers, database osv. som er meget svær at læse sig til. Det kræver for det fleste en kombination af studie og erfaring.
Avatar billede lifo Nybegynder
06. juli 2005 - 10:00 #11
Imago-dai  det er ikke rigtigt at det kun er MSSQL som er dunderstøttet af DAAB
det var tilfældet med version 2
men version 3 er lavet med interfaces i steden for konkredte SQLxxx metoder så flere understøttet
selv bruger jeg DAAB til Firebird
og det fungerer udmærket og meget meget simpelt at bruge
Avatar billede imago-dei Nybegynder
06. juli 2005 - 10:02 #12
lifo ja det er korrekt. Undskyld min fejl.
Avatar billede Syska Mester
06. juli 2005 - 10:22 #13
Men for lige at vende lidt tilbage, er jeg ved at få en bedre forståelse af det, men ville gerne have et eksempel på kode til et 2 Tier....

Bare sådan for at se hvordan andre bygger det op, og så kan jeg derfra danne min egen mening bagefter og jeg synes det er smart, eller bare endnu mere besværligt end sådan som jeg gør nu....

Synes nemlig at jeg altid bare får smidt de fleste af mine programmer i min start klasse, og bare laver funktioner i den....

// ouT
Avatar billede imago-dei Nybegynder
06. juli 2005 - 10:30 #14
Det er svært at komme med et konkret eksempel her. Prøv at søge på det på google.

I mine programmer bruger jeg ofte stored procedures. Og jeg har en connectionstring í web.config (hvis det er et web program).

Eksempel, hvor jeg i en sproc henter alle subscribers af en tjeneste:

DataSet dsSubscribers = SqlHelper.ExecuteDataset(GetConnectionString(), "GetAllSubscribers");

Bemærk: eksemplet bygger på DAAB. Som du ser er du helt fri for at oprette og nedlægge connections osv. Enklere bliver det ikke.
Avatar billede arne_v Ekspert
06. juli 2005 - 10:42 #15
Enklere bliver det nok ikke.

Men jeg kan ikke lide:
  - at DataSet bliver brugt som DTO fordi der ligger alt for meget database i den klasse
  - at den er om ikek SQLServer specifik så ihvertfald database med support
    for stored procedure afhængig
Avatar billede Syska Mester
06. juli 2005 - 14:02 #16
DTO?

Ja, jeg vil/skal ikke over i "only" stored procedures, da jeg endnu ikke er sikker på hvad database server der skal bruges i sidste ende, måske en firebird, den er der jo mange der snakker godt om :-)

// ouT
Avatar billede arne_v Ekspert
06. juli 2005 - 14:05 #17
DTO = Data Tranfer Object

i en tidliger ekommentar brugte jeg den hjemmebryggede "en af dine data bærende klasser"
Avatar billede Syska Mester
06. juli 2005 - 14:42 #18
Ja, jeg må vel bare prøve mig frem som i siger.....

Men hvad med Error handeling....

Hvis jeg nu laver min egen klasse, laver man så signe egne Exception, og catch'er dem?

Egentlig den eneste måde vel at få helt tilbage til sit egen program og finde ud af hvad der gik galt? eller hvordan?

For som imago-dei skriver:
DataSet dsSubscribers = SqlHelper.ExecuteDataset(GetConnectionString(), "GetAllSubscribers");
retunere et DataSet, men man vil vel også gerne vide hvad der eventuelt gik galt i en den klasse? måske der jeg er i tvivl, kan ikke rigtig finde ud af det.... for så skal der jo alligevel laves nogle try-catch ting omkring:
DataSet dsSubscribers = SqlHelper.ExecuteDataset(GetConnectionString(), "GetAllSubscribers");

// tilbage til tænke boksen igen
Avatar billede arne_v Ekspert
06. juli 2005 - 14:54 #19
jeg har jo skrevet min foretrukne 09:09:54
Avatar billede lifo Nybegynder
06. juli 2005 - 15:03 #20
vell jeg bruger stored procedures men også almindeligt sql
og man behøver ikke at bruge et dataset til DTO
her er et eksempel hvor jeg bruger en DataReader og et hjemmelavet objekt

public ArrayList kat_get()
        {
            ArrayList al = new ArrayList();
            IDataReader dr =  fbh.ExecuteReader(DAL.connectionString,CommandType.Text,"select * from tblkategori");
            while(dr.Read())
            {
                Kategori kate = new Kategori(
                    dr.GetString(dr.GetOrdinal("kname")),
                    dr.GetString(dr.GetOrdinal("kcomment")),
                    dr.GetInt32(dr.GetOrdinal("kid")),
                    dr.GetInt32(dr.GetOrdinal("kparent")));
                al.Add(kate);
            }
            dr.Close();
            return al;
        }
Avatar billede Syska Mester
06. juli 2005 - 15:54 #21
Ja, den må jeg være snublet over, sorry, ja, også sådan min tanke gang var....

Når jeg har lavet lidt mere vil jeg poste hvad jeg har lavet, så kan i jo komme med nogle kommentare.....

// ouT
Avatar billede arne_v Ekspert
24. juli 2005 - 15:26 #22
buzz>

er det ved at være tid for at få afsluttet her ?

bed dem som du mener har hjulpet dig ligge et svar og give dem lidt tid til det
inden du accepterer
Avatar billede Syska Mester
26. december 2005 - 19:01 #23
smid nogle svar... dem som har hjulpet... så kan i dele

// ouT
Avatar billede arne_v Ekspert
26. december 2005 - 19:58 #24
ok
Avatar billede imago-dei Nybegynder
29. december 2005 - 16:20 #25
Må vi høre helt kort hvilken løsning du valgte.
Avatar billede Syska Mester
29. december 2005 - 16:40 #26
Ikke rigtig nogen speciel.....

Fandt aldrig noget eksemple hvor et lille program var opbygget, så jeg kunne se nogle af måderne i aktion....

Men blev da alligevle en del klogere... så jeg takker da for svarene...

// ouT
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger elementleder til System sektionen i Hvidovre

Ringkjøbing Landbobank – Nordjyske Bank

Forretningsudvikler til procesoptimering

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Netværkstekniker til Forsvarets Cyberdivision i Hvidovre – Er det dig?