Hey,
Ik maak regelmatig kleine applicaties voor mensen die ik ken, vrienden en af en toe 'klanten', en voor de meeste applicaties gebruik ik een MS Access database (2003 formaat). Waarom Access? Nou, omdat dat makkelijk is (SQL server installeren ga ik echt niet aan beginnen bij elke klant, ik zou niet eens weten hoe) en omdat ik niet meer nodig heb dan een paar tables.
Hoewel alles prima werkt loop ik toch steeds tegen hetzelfde 'probleem' aan: elke keer als ik een nieuwe applicatie begin komt er een heel stuk 'boilerplate' code aan te pas om de database te kunnen gebruiken. Het is steeds dezelfde code, enkel met andere tabellen en klassen.
De aanpak die ik gebruik is langzaam wat beter en sneller (minder boilerplate) geworden, maar het komt steeds weer neer op dit:
Voor elke tabel maakte ik een 'Manager' klasse en een 'Entity' klasse. Een Entity stelt dan een rij voor in die tabel, en de Manager klasse heeft methodes om de rijen te laden, op te slaan, te wijzigen, etc. Vrij standaard allemaal lijkt me. De Entity klassen hebben gewoon een property voor elke kolom in de database.
De Manager klasse roept dan methodes op een Database klasse aan zoals ExecuteNonQuery, ExecuteReader, etc.
In het begin was elke manager klasse een los staand object en moest ik dus elke keer opnieuw de SQL query handmatig typen, parameters toevoegen, etc. Na een tijdje ben ik overgestapt op TableAdapters (ik weet niet precies hoe dit genoemd wordt) waarbij ik in Visual Studio de table adapters kan maken en daarop queries kan maken, die ik dan in mijn manager klasse gewoon aanroep. Maar nog steeds moet ik voor elke tabel zo'n adapter maken en de queries erop plaatsen, ook al zijn die queries 9/10 keer precies hetzelfde enkel met andere tabel en kolom namen.
Ik zoek nu eigenlijk iets dat dit proces kan versnellen. 90% van de code (inclusief queries) die ik nu handmatig krijg kan ik ook automatisch laten genereren omdat het steeds hetzelfde is. Ik zoek nu enkel nog iets dat me dit laat doen...
Bijvoorbeeld het Entity Framework is iets wat ik vaak tegenkom, maar voor zover ik weet werkt dit niet met Access. NHibernate lijkt ook te kunnen doen wat ik wil, en hoewel dat wel Access zou moeten kunnen ondersteunen is het me tot nu toe niet gelukt, na een week of wat experimenteren... Steeds weer nieuwe errors hier en daar, zelfs op voorbeelden die specifiek moeten tonen hoe je met Access verbind (die voorbeelden zijn wel al oud, gebruiken versie 2 van NH en ze zitten nu op 3 geloof ik?).
Ik heb zelfs al zelf een 'framework' geschreven dat precies doet wat ik wil. Ik heb een Entity klasse gemaakt (met properties die ik per conventie elke tabel geef: Id, Deleted, CreatedTime en UpdatedTime), en een EntityManager(Of T As Entity) die een Load, LoadById en Save methode heeft (en nog wat andere dingen).
Voor een nieuwe tabel maak ik nu een nieuwe klasse aan die van Entity overerft, geef hem de nieuwe properties, en zet nu bij elke property er een eigen attribuut omheen die de naam van de kolom in de database geeft. De klasse zelf krijgt ook een attribuut wat de tabelnaam geeft. Met die informatie kan ik, via veelvuldig gebruik van Reflection, in de EntityManager klasse de Load en Save methodes automatisch genereren.
Dat werkt ongeveer zo:
Dus ja, ik zoek echt alternatieven die me helpen om de boilerplate code te vermijden. Ik zal zelf nog doorzoeken met NHibernate (heeft iemand toevallig nog tutorials ofzo hoe ik met Access verbind?) maar wellicht zijn er wel makkelijkere alternatieven, vooral omdat het allemaal vrij simpel is wat ik nodig heb.
Bedankt!
Ik maak regelmatig kleine applicaties voor mensen die ik ken, vrienden en af en toe 'klanten', en voor de meeste applicaties gebruik ik een MS Access database (2003 formaat). Waarom Access? Nou, omdat dat makkelijk is (SQL server installeren ga ik echt niet aan beginnen bij elke klant, ik zou niet eens weten hoe) en omdat ik niet meer nodig heb dan een paar tables.
Hoewel alles prima werkt loop ik toch steeds tegen hetzelfde 'probleem' aan: elke keer als ik een nieuwe applicatie begin komt er een heel stuk 'boilerplate' code aan te pas om de database te kunnen gebruiken. Het is steeds dezelfde code, enkel met andere tabellen en klassen.
De aanpak die ik gebruik is langzaam wat beter en sneller (minder boilerplate) geworden, maar het komt steeds weer neer op dit:
Voor elke tabel maakte ik een 'Manager' klasse en een 'Entity' klasse. Een Entity stelt dan een rij voor in die tabel, en de Manager klasse heeft methodes om de rijen te laden, op te slaan, te wijzigen, etc. Vrij standaard allemaal lijkt me. De Entity klassen hebben gewoon een property voor elke kolom in de database.
De Manager klasse roept dan methodes op een Database klasse aan zoals ExecuteNonQuery, ExecuteReader, etc.
In het begin was elke manager klasse een los staand object en moest ik dus elke keer opnieuw de SQL query handmatig typen, parameters toevoegen, etc. Na een tijdje ben ik overgestapt op TableAdapters (ik weet niet precies hoe dit genoemd wordt) waarbij ik in Visual Studio de table adapters kan maken en daarop queries kan maken, die ik dan in mijn manager klasse gewoon aanroep. Maar nog steeds moet ik voor elke tabel zo'n adapter maken en de queries erop plaatsen, ook al zijn die queries 9/10 keer precies hetzelfde enkel met andere tabel en kolom namen.
Ik zoek nu eigenlijk iets dat dit proces kan versnellen. 90% van de code (inclusief queries) die ik nu handmatig krijg kan ik ook automatisch laten genereren omdat het steeds hetzelfde is. Ik zoek nu enkel nog iets dat me dit laat doen...
Bijvoorbeeld het Entity Framework is iets wat ik vaak tegenkom, maar voor zover ik weet werkt dit niet met Access. NHibernate lijkt ook te kunnen doen wat ik wil, en hoewel dat wel Access zou moeten kunnen ondersteunen is het me tot nu toe niet gelukt, na een week of wat experimenteren... Steeds weer nieuwe errors hier en daar, zelfs op voorbeelden die specifiek moeten tonen hoe je met Access verbind (die voorbeelden zijn wel al oud, gebruiken versie 2 van NH en ze zitten nu op 3 geloof ik?).
Ik heb zelfs al zelf een 'framework' geschreven dat precies doet wat ik wil. Ik heb een Entity klasse gemaakt (met properties die ik per conventie elke tabel geef: Id, Deleted, CreatedTime en UpdatedTime), en een EntityManager(Of T As Entity) die een Load, LoadById en Save methode heeft (en nog wat andere dingen).
Voor een nieuwe tabel maak ik nu een nieuwe klasse aan die van Entity overerft, geef hem de nieuwe properties, en zet nu bij elke property er een eigen attribuut omheen die de naam van de kolom in de database geeft. De klasse zelf krijgt ook een attribuut wat de tabelnaam geeft. Met die informatie kan ik, via veelvuldig gebruik van Reflection, in de EntityManager klasse de Load en Save methodes automatisch genereren.
Dat werkt ongeveer zo:
- Zodra een Entity object aangemaakt wordt zoekt hij z'n eigen properties op via Reflection en slaat deze op in een property (zodat dit niet elke keer hoeft te gebeuren)
- Voor een Load methode wordt een SQL Select query gemaakt (altijd SELECT * voor enkele tabellen, of wat simpele joins voor gekoppelde tabellen, meer heb ik toch niet nodig) en via ExecuteReader wordt er door een IDataReader gelooped
- Voor elk result in de IDataReader zoek ik op welke property daar bij hoort in de Entity klasse, en via Reflection zet ik dan die property.
- Voor een Save methode gebeurt hetzelfde maar dan andersom. Een SQL Update/Insert query wordt gegenereerd en met een loopje door de properties van de Entity klasse in kwestie kan ik de parameters en waarden in de query stoppen.
Dus ja, ik zoek echt alternatieven die me helpen om de boilerplate code te vermijden. Ik zal zelf nog doorzoeken met NHibernate (heeft iemand toevallig nog tutorials ofzo hoe ik met Access verbind?) maar wellicht zijn er wel makkelijkere alternatieven, vooral omdat het allemaal vrij simpel is wat ik nodig heb.
Bedankt!