Baza danych - łączenie tabel

Odpowiedz Nowy wątek
2013-12-29 16:00
0

Cześć, mam problem z połączeniem tabel w moim programie. Mam tabelę towar z kolumanami - |ID_Towaru | Marka | Model| i tabelę zamówienie z kolumnami - |ID_Zamowienia | ID_Towaru|. Po wybraniu danego towaru z tabeli Towar i kliknięciu buttona1 ID_Towaru przechodzi do tabeli Zamówienie. Po przeniesieniu danej rzeczy do tabeli Zamowienia od razu odświeża się jej zawartość i chciałbym żeby w tabeli oprócz wcześniej przeniesionego ID_Towaru była też Marka i Model wzięte z tabeli Towar na podstawie ID. Kod mam taki:

string numer = dataGridView2.Rows[dataGridView2.CurrentCell.RowIndex].Cells[0].Value.ToString();
string łańcuchPołączenia = @"Provider=Microsoft.ACE.OLEDB.12.0;data source=F:\Sklep AGD\SklepAGD.accdb";
OleDbConnection łączeOle = new OleDbConnection(łańcuchPołączenia);
łączeOle.Open();
DataSet zestawDanych = new DataSet();
string kwerenda = @"SELECT ID_Zamowienia, Zamówienie.ID_Towaru, Towar.Model, Towar.Marka 
FROM Zamówienie INNER JOIN Towar ON [Zamówienie].ID_Towaru=Towar.ID_Towaru;";
kwerenda = string.Format(kwerenda, numer);
OleDbDataAdapter adapter = new OleDbDataAdapter(kwerenda, łączeOle);
adapter.Fill(zestawDanych);
łączeOle.Close();
dataGridView1.DataSource = zestawDanych.Tables[0];

Ale niestety coś jest nie tak bo cały czas mam tylko ID_Towaru wyświetlane w programie. Co ciekawe, sama kwerenda zdaje się działać po sprawdzeniu bezpośrednio w Accessie i oczywiście w szkole, przy profesorze to działało...

Pozostało 580 znaków

2013-12-29 16:38
0

Cześć,
Nie za bardzo rozumiem, co chciałeś osiągnąć, przez

kwerenda = string.Format(kwerenda, numer);

Czy bez dołączenia stringa "numer" zwracane są wszystkie dane ze złączenia?

Pozostało 580 znaków

2013-12-29 17:17
0

Oj, przepraszam ale wkleiłem nie aktualny kod, to jest stara wersja tego mojego "odświeżacza". Tak wygląda świeży kod:

private void OdświeżenieZawartościGridu(OleDbConnection łączeOle)
        {
            DataTable noweDaneTabeli = new DataTable();
            string kwerenda = "SELECT ID_Zamowienia, Zamowienia.NR_Towaru, Towar.Rodzaj, Towar.Model, Towar.Marka FROM Zamowienia INNER JOIN Towar ON    Zamowienia.NR_Towaru=Towar.ID_Towaru;";
            OleDbDataAdapter pośrednikOle = new OleDbDataAdapter(kwerenda, łączeOle);
            pośrednikOle.Fill(noweDaneTabeli);
            dataGridViewZamowienia.DataSource = noweDaneTabeli;
        }

Tutaj już string numer nie ma jednak nadal wyświetlany jest tylko NR_Towaru(ID_Towaru) wcześniej przeniesiony z tabeli Towar.

edytowany 1x, ostatnio: Skreedi, 2013-12-29 17:18
Na marginesie, używanie znaków narodowych w nazwach zmiennych nie jest dobrą praktyką (ja w ogóle bym unikał polskich nazw, ale to już może być dyskusyjna sprawa). - Hrypa 2013-12-29 17:53

Pozostało 580 znaków

2013-12-29 17:33
0

Nie wiem, czy dobrze rozumiem problem, ale z tego co piszesz:

wyświetlany jest tylko NR_Towaru(ID_Towaru) wcześniej przeniesiony z tabeli Towar

wygląda na to, że NR_Towaru pochodzi z poprzedniego wypełniania Gridu, a nie jest wynikiem obecnej kwerendy.

Spróbuj wykorzystać OleDbCommand:

     OleDbConnection connection = new OleDbConnection(łączeOle);
                connection.Open();
                OleDbCommand selectCommand = new OleDbCommand("SELECT ID_Zamowienia, Zamowienia.NR_Towaru, Towar.Rodzaj, Towar.Model, Towar.Marka FROM Zamowienia INNER JOIN Towar ON    Zamowienia.NR_Towaru=Towar.ID_Towaru;", connection);
                OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand);
                DataSet dataSet = new DataSet();
                adapter.Fill(dataSet);

Pozostało 580 znaków

2013-12-29 18:29
0

Niestety, nadal nic, a nawet gorzej, bo teraz kiedy dodałem jeszcze jedną tabelę wyświetla się tylko NR_Towaru...

Opiszę problem jeszcze raz, tym razem najdokładniej jak tylko potrafię.
Mam trzy tabele - Klienci, Towar i Zamowienia.

  • Tabela Klienci ma kolumny - |ID_Klienta|Imie|Nazwisko|Telefon|Miasto|Ulica|
  • Tabela Towar ma kolumny - |ID_Towaru|Rodzaj|Marka|Model|Cena|
  • Tabela Zamowienia ma kolumny - |ID_Zamowienia|NR_Towaru|NR_Klienta|

Teraz, po zaznaczeniu danego klienta i interesującego nas towaru klikamy guzik "Dodaj" i ID_Klienta i ID_Towaru ląduje w tabeli Zamowienia pod zmienionymi nazwami (ID_Klienta == NR_Klienta, ID_Towaru == NR_Towaru).

Problem pojawia się przy wyświetlaniu zawartości tabeli Zamowienia, kolumny z ID i NR mają być ukryte więc mój program na podstawie tych numerów ma z tabeli Towar i Klienci wziąć dane - Imie, Nazwisko, Telefon z tabeli Klienci i Rodzaj, Marka, Model z tabeli Towar.

Wiem, że wcześniej podawałem kod z kwerendą tylko odnoszącej się do tabeli Towar i Zamowienia ale niestety nie pomyślałem, że tabela z klientami też jest w programie bez powodu.

Pozostało 580 znaków

2013-12-29 18:55
0

Nie wiem co rozumiesz pod zmienionymi nazwami.
Jeżeli tworzysz relacyjną bazę danych, tabelę muszą być złączone przez odpowiednie wartości.
Upewnij się na początek, że we wszystkich 3 tabelach znajdują się rekordy dla których indeksy są równe :Zamowienia.NR_Towaru=Towar.ID_Towaru

Pozostało 580 znaków

2013-12-29 20:48
0

Ze zmienionymi nazwami chodzi o to aby np. ID_Klienta w tabeli Zamowienia nazywało się NR_Klienta, tak samo dla ID_Towaru.
Co do rekordów kwerenda wygląda tak: SELECT Towar.Rodzaj, Towar.Model, Towar.Marka FROM Zamowienia INNER JOIN Towar ON Zamowienia.NR_Towaru=Towar.ID_Towaru; - jednak jak wcześniej pisałem, jest ona skonstruowana z myślą tylko o tabelach Towar i Zamowienia. W tej chwili muszę dołączyć do tego tabelę Klienci i z niej też coś wyciągnąć do tabeli Zamowienia.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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