Program z bazą danych - wprowadzanie danych

0

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?

0

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ę.

0

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.

0

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

1

Dokładnie tak jak wyżej jest napisane, tylko do odczytania ostatniego wstawionego idka, najlepiej użyć polecenia:

 SELECT @@IDENTITY;
0

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ę.

0

No ja ******

  1. 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.

  2. Robisz INSERT do tabeli NADAWCA - tak jak do tej pory

  3. 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")

  4. 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.

  5. Zatwierdzasz transakcję (transaction commit)

0

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.

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