06. juli 2005 - 08:40Der 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...
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.
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.
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"... :-)
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.
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.
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.
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
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....
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
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 :-)
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");
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; }
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
Synes godt om
Ny brugerNybegynder
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.