30. november 2009 - 01:09Der er
15 kommentarer og 1 løsning
Hjælp til at bygge en generisk SQL Commit Metode.
Hejsa.
Jeg er ved at lave et lille forsøg og har brug for lidt hjælp.
Først lidt fakta:
1. Property navne på mine objekter er altid de samme som feltnavne i SQL databasen.
2. Kompleksibiliteten vil være forholdsvis simpel. Jeg er klar over at det her nok er en dårlig løsning til store komplekse databse setups.
Jeg forsøger at lave en metode som gerne skulle kunne være rimelig meget "Plug And Play". Altså en metode jeg gerne vil kunne genbruge på mange objekter uden at skulle skrive den om.
Mine objekter indeholder som regl kun Strings, Int's, Boolean's samt referencer til andre objekter.
Jeg har så lavet en metode som gennemløber alle properties for et objekt og gerne skulle kunne opbygge en SQL Query automatisk som kan opdatere min database.
Det er ikke testet endnu, men umiddelbart vil jeg mene at det skulle virke fint nu, så længe at der ikke er referencer til andre objekter som skal med i min query.
Men jeg er i tvivl omkring hvordan man ved gennemløb af properties på et objekt finder ud af hvilket andet objekt der er en reference til.
Jeg kan se der trækkes en bool værdi ud for hver property som fortæller mig om denne property er en objekt reference.
Men hvis denne værdi er TRUE så har jeg brug for at kunne gå ned på dette andet objekt og fremfinde værdien for den property som hedder "Id" (på det andet objekt). Id propertien findes altid på mine objekter og det er denne værdi jeg bruge i databasen til at gemme referencer mellem de forskellige data.
Puha, lang smørre. Håber jeg har gjort mig nogenlunde forståelig.
Jeg har vedhæftet den kode jeg har (og håber/forventer virker allerede nu. Bare uden at kunne håndtere properties som er objekt referencer)
Mvh. Lasse
public void Commit() { Type ObjectType = typeof(Player); string tblname = "tb_players"; string query = string.Empty;
System.Reflection.PropertyInfo[] propertyInfo = ObjectType.GetProperties(); if (this.Id > 0) { query = "update " + tblname + " "; foreach (System.Reflection.PropertyInfo info in propertyInfo) { Type t = info.PropertyType; string proptype = t.Name;
Jeg smider lige hele metoden ind i tråden hvis andre skulle være interesseret i at se hvordan det kan laves.
Mvh. Lasse
public void Commit() { // Specify Name of SQL Table string tblname = "tb_players";
// Empty Params used in Method. string query = string.Empty; string classes = string.Empty;
// Set witch class references should be written to DB. classes = "Company;Phonenumbers";
System.Reflection.PropertyInfo[] propertyInfo = this.GetType().GetProperties(); /// If Id Property of current Object is higher than 0 then build and update query. if (this.Id > 0) { query = "update " + tblname + " set ";
/// Loop all properties of object. foreach (System.Reflection.PropertyInfo info in propertyInfo) { Type t = info.PropertyType; string proptype = t.Name;
Så vidt jeg kan vurdere er det en ORM uden nogen former for konfiguration hverken XML, attributter eller genereret kode han er ved at lave (ved at bruge konventioner for klasserne og databasen).
Prepared statements aner jeg ikke hvad er. Men det må jeg da have undersøgt :-)
Grunden til at jeg godt kunne tænke mig funktionen er for at få en Database Commit metode som er generisk og kan bruges på alle de klasser jeg laver og i forskellige projekter uden at jeg skal skrive SQL koden manuelt for hver klasse.
Og der må ikke skulle ændres mere end 1 - 2 variabler. For så tager det for lang tid at implementere.
Og den løsning jeg har fået skrevet nu ser ud til at opfylde de krav.
Så må vi jo så se om det er til at arbejde med i praksis.
> Grunden til at jeg godt kunne tænke mig funktionen er for at få > en Database Commit metode som er generisk og kan bruges på alle > de klasser jeg laver og i forskellige projekter uden at jeg skal > skrive SQL koden manuelt for hver klasse.
Lyder meget ala. ORM eller ActiveRecord. Tag et kig på Entity Framework (tidligere kendt som Linq2SQL), og nHibernate.
ja, og det er vel også udenfor MS verdenen eller ?
Eller hvad er det du henviser til ... kan ikke lige se sammenhængen.
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.