Sa zicem ca suntem in C#,avem SQL 2005 si o tabela( de ex., utilizatori) pe care trebuie sa implementam un (fel de ) mecanism de CDC – automat.
Creeam o noua tabela, utilizatori_history,identica cu precedenta, la care adaugam 3 cimpuri ( de_la_data, la_data, si stare : insert, update, delete)
Ne jucam cu Linq 2 SQL (pentru ca e foarte rapid) – si am vrea ca sa se faca (relativ) automat – adica sa nu lasam la latitudinea celor care folosesc clasa utilizatori daca sa inregistreze sau nu istoricul.
Nici o problema – in DataContext, pentru fiecare tabela, exista un eveniment de <insert-update-delete> de tipul partial
void <Metoda><NumeTabela>(<tabela> nume), in cazul nostru
partial
void InsertUtilizatori(Utilizatori instance)
Super – e suficient sa interceptam evenimentul si sa scriem datele intr-o noua instanta de utilizatori_history , o adaugam la this.Utilizatori_history si facem submitchanges impreuna cu this.ExecuteDynamicInsert(instance); pentru a salva utilizatorii noi.
Din pacate, ne trage in piept … si anume o eroare ca nu avem voie sa facem acest lucru in metoda…Si are (partial) dreptate.
Asa incit solutia alternativa (nu foarte buna, dar merge) este sa creeam un nou data context de la 0:
MyDataContext my=new
MyDataContext(this.Connection); //pastram aceeasi conexiune
my.Transaction =this.Transaction; //si tranzactie
my. Utilizatori_history.InsertOnSubmit(history);
my.SubmitChanges();
Cam asta ar fi … Ma rog, daca vrem si informatii aditionale( de ex., ce user a fost, etc) le putem adauga in history la creearea obiectului istoric.
Ce ar mai fi de facut, daca nu ar fi fost facut in SQL2008:
Adaugat prin Code generat , pentru fiecare tabela din DataContext, una de history – si suprascris fiecare eveniment…
Foarte foarte interesant acest blog. Deasemenea de un real ajutor tutorialul de .net 2.0. A fost primul tutorial care cu adevarat m-a ajutat. Astept cu nerabdare finalizarea tutorialului de .net 3.5 pentru a ma apuca in sfarsit de lucruri serioase.
“Not knowledge is power but knowledge sharing is power”
Respect.