Witam wszystkich, mam taki problem. Wykonuję projekt na studia, który ma być połączony z bazą danych. Mam problem z dodaniem danych do bazy. Otóż posiadam dwie tabele - Nadawca i Przesylki. Pierwsza zawiera dane nadawcy, a druga dane podane przez nadawcę (czyli dane osobowe odbiorcy itp.). Projekt bazy danych został wykonany w Accessie (wiem, głupie ale tak nam kazano). I teraz największy problem jest taki, że obydwie mają między sobą relację typu: Nadawca.Identyfikator(klucz główny)=Przesylki.IdNadawca(klucz obcy). Jednak z powodu, że nie da się zastosować dla dwóch tabel jednocześnie komendy insert, w samej bazie jak i przy odczycie danych nie wykazuje relacji pomiędzy nadawcą, a nadaną przesyłką. I tu keiruje pytanie - czy da się to jakoś wprowadzić z uwzględnieniem tej relacji, czy trzeba będzie po prostu dane nadawcy umieścić w tabeli Przesylki?
Coś chyba kombinujesz. Rozpoczynasz transakcję, robisz insert do tabeli Nadawcy - pobierasz ID tego rekordu - robisz insert do tabeli przesylki (z pobranym id nadawcy) i zamykasz transakcję.
A mógłbyś przedstawić jak dokładnie ma to wyglądać? Lekko się gubię w tych komendach. Bo do tej pory mam coś takiego:
connection.Open();
OleDbCommand com = new OleDbCommand();
com.Connection = connection;
com.CommandText = "insert into Nadawca (Imie,Nazwisko,Miasto,Adres,Kod_Pocztowy,Numer_Telefonu) values('" + textBox1.Text +"','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "')";
com.ExecuteNonQuery();
com.CommandText = "insert into Przesylki (Imie,Nazwisko,Adres,Miasto,KodPocztowy,NumerTelefonu,PlatnoscZGory,Rodzaj) values('" + textBox9.Text + "','" + textBox10.Text + "','" + textBox11.Text + "','" + textBox12.Text + "','" + textBox13.Text + "','" + textBox14.Text + "','" + textBox15.Text + "','" + textBox16.Text + "')";
com.ExecuteNonQuery();
connection.Close();
this.Close();
Próbowałem dodać po drugim execute jeszcze jedno:
com.CommandText = "insert into Przesylki (IdNadawca) select Identyfikator from Nadawca";
com.ExecuteNonQuery();
Ale wtedy visual przy próbie dodania danych wykazywał błąd.
Cześć, ja to robię w ten sposób że najpierw wstawiam rekord do pierwszej tabelki. W następnym ruchu po zatwierdzeniu przez motor bazy danych tego INSERT odczytuję ostatni rekord
SELECT ID_NADAWCA FROM NADAWCA
i ten numer wykorzystuje w następnym INSERT to wpisania danych do drugiej tabelki
Dokładnie tak jak wyżej jest napisane, tylko do odczytania ostatniego wstawionego idka, najlepiej użyć polecenia:
SELECT @@IDENTITY;
Hmmm. Nie ogarniam. Jak moglibyście mi to zapisać jak dokładnie ma to wyglądać, albo w tym kawałku kodu, może bym zrozumiał. Bo tak to na razie nie wiem co czynię.
No ja ******
-
Rozpoczynasz transakcję. Jest to konieczne, ponieważ robisz dwa inserty, które są ze sobą w pewien sposób połączone. Jeśli nie masz transakcji, to załóżmy, że po zrobieniu pierwszego insertu wysiada Ci prąd. Drugi Insert już nie pójdzie i masz niespójne dane w bazie. Jeśli prądu Ci zabraknie w momencie, gdy rozpocząłeś transakcję, to żaden insert nie pójdzie. Dzięki czemu nie masz niespójności w bazie danych. Jak rozpocząć transakcję - możesz doczytać w necie.
-
Robisz INSERT do tabeli NADAWCA - tak jak do tej pory
-
Z tabeli NADAWCA pobierasz ostatnio wstawione do tej tabeli ID. Możesz to zrobić dwojako:
gorzej: "SELECT max(ID) from NADAWCA"
lepiej: "SELECT @@IDENTITY"
lub posłuż się jakąś inną konstrukcją, którą dostarcza Twój system zarządzania bazą danych. Bo @@IDENTITY działa tylko na MSSQL. (możesz to znaleźć szukając pod kątem "last inserted id") -
Mając już odpowiednie ID z tabeli nadawca (które uzyskałeś w kroku 3), robisz INSERT do tabeli PRZESYLKI. Jako ID nadawcy podajesz to ID, które uzyskałeś w korku 3.
-
Zatwierdzasz transakcję (transaction commit)
com.CommandText = "insert into Nadawca (Imie,Nazwisko,Miasto,Adres,Kod_Pocztowy,Numer_Telefonu) values('" + textBox1.Text +"','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "')";
ooo?
Już jeden z kolegów w komentarzu napisał..
Być może się dopiero uczysz -> ok. Nie wstawiaj w zapytaniu bezpośrednio właściwości kontrolek.
Koniecznie, ale to koniecznie zapoznaj się z klasa SqlParameter.