Automatyczne insertowanie do relacyjnej bazy danych.

0

Witam. Mam problem tego typu ze po dodaniu kolejnego uzytkownika w tabeli poprzez aplikacje chcialbym automatycznie stworzyc dla niego w relacyjnej tabeli kilka domyslnych rekordow. Co jest najlepsza metoda w takim wypadku? Czytalem cos o triggerach ale czy jest jakas alternatywna metoda wywolania insertow w kodzie? Nie wiedzialem jak bezposrednio odwolac sie to PK swiezo utworzonego uzytkownika (udaje mi sie to dopiero po wczytaniu npz datagriedview albo comboboxa wybranego rekordu). Uzywalem tez : "SELECT @@identity " oraz getlastid() ale zwracalo mi wartosci null.

//tak dodaje uzytkownika (kolumna id to PK,dodaje sie automatycznie z autoinkrementacja)

string ssql = "INSERT INTO pielegniarki VALUES (@personalia)";
objCmd1.Parameters.AddWithValue("@personalia", per);

//to chcialbym dodac (PK dodaje sie automatycznie  z autoinkrementacja, userid to klucz obcy dla id uzytkownia)

string ssql1 = "INSERT INTO zaplanowane VALUES (@1, @2, @3) WHERE USERID =" + //(tu nie wiedzialem co wstawic, probowalem z wyniakmi zapytan @@identity i getlastid()+;

cmd.Parameters.AddWithValue("@1", 0);
cmd.Parameters.AddWithValue("@2", 0);
cmd.Parameters.AddWithValue("@3", 0);
1

Jak już chcesz pracować z bazą poprzez własną aplikację, zainteresuj się Simple Data, potem jak to ogarniesz, zainteresuj się nHibernate. Simple Data jest prosta w konfiguracji i unikniesz masę niepotrzebnego kodu. W twoim stylu jak piszesz pobranie najświeższego id będzie można zrobić już po zakończeniu transakcji i wtedy można ponownie bezę pytać o ID tegoż usera. Chyba, że id jest autoinkrementowane wtedy zaraz po dodaniu usera jego id to MAX() pod warunkiem, że nie występuje współbieżny dostęp do danych. Co do przypisywania rekordów. Można i procedurą i można wyzwalaczem. Ty zrób to sobie procedurą składowaną bo i pewnie jej dobrze na razie nie potrafisz napisać.

Pozdrawiam.

1
godeath napisał(a):

Uzywalem tez : "SELECT @@identity " oraz getlastid() ale zwracalo mi wartosci null.

A jak wywoływałeś to zapytanie? Bo powinno zadziałać.

Po drugie, to ręczne pisanie SQL jest okradaniem samego siebie z czasu.

Ciekawski napisał(a):

W twoim stylu jak piszesz pobranie najświeższego id będzie można zrobić już po zakończeniu transakcji i wtedy można ponownie bezę pytać o ID tegoż usera. Chyba, że id jest autoinkrementowane wtedy zaraz po dodaniu usera jego id to MAX() pod warunkiem, że nie występuje współbieżny dostęp do danych.

Nie wiem jak to wygląda w przypadku Simple Data, ale w przypadku ORMów powszechna praktyką jest wyłączenie autoinkrementacji bazodanowej i zlecenie generowania ID ORMOwi (przez jakiś wbudowany mechanizm albo np. Snowflake). Dzięki temu można mieć komplet kluczy jeszcze przed wysłaniem poleceń do bazy i nie trzeba rozwiązywać problemów, które się samemu sobie stworzyło. ;)

0

@somekind, dobrze wiedzieć, przynajmniej wiem, że dotychczas robiłem gafę :) Co prawda długo się ona nie ciągnęła bo z ORM-em mam do czynienia około miesiąca. Odnośnie klucza głównego ( ID ) mówimy między innymi np. o: http://msdn.microsoft.com/pl-pl/library/system.guid.newguid.aspx ??

1 użytkowników online, w tym zalogowanych: 0, gości: 1