2010-11-28 18 views
5

Mam bazę danych z dwiema tabelami. Obie te tabele są powiązane i mają to samo pole kluczowe. Na przykład oba mają wiersze danych odpowiadające ISBN = 12345, ale dwie tabele mają różne dane o tym numerze ISBN.Potrzebujesz pomocy w pracy z bazami danych w C#

Tak więc, próbuję dowiedzieć się, jak wyświetlić dane z obu tabel w jednym dataGridView. Próbowałem niektórych poleceń SQL, które znalazłem online, ale wygląda na to, że polecenia w języku C# mogą różnić się od zwykłych zapytań SQL.

Załóżmy, że tabela 1 zawiera następujące pola: ISBN, kolor, rozmiar i tabela2 mają pola ISBN, waga.

Potrzebuję sposobu wyświetlania numeru ISBN, koloru, rozmiaru, wagi w moim widoku datagridu. Myślę, że będę musiał jakoś to zrobić za pomocą przejściówki. Mogę łączyć się i wykonywać zapytania na tabelach indywidualnie i pokazywać te dane w moim datagridview, ale nie mogę wymyślić, jak połączyć dane z dwóch oddzielnych tabel.

Jeśli masz dobry zasób, mogę o tym przeczytać, chciałbym go mieć, mój google-fu mnie zawodzi.

Oto przykład coś mogę zrobić teraz z mojej bazy danych:

private void Form1_Load(object sender, EventArgs e) 
    { 
     // TODO: This line of code loads data into the 'database1DataSet.Book' table. You can move, or remove it, as needed. 
     this.bookTableAdapter.Fill(this.database1DataSet.Book); 
     string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\Users\Geoff\Documents\cs 351\Database1.accdb" + ";Persist Security Info=False;"; 
     OleDbConnection conn = new OleDbConnection(connectionString); 
     string query = "select * from Book where ISBN = 12345"; 
     OleDbCommand com = conn.CreateCommand(); 
     com.CommandText = query; 
     OleDbDataAdapter adapter = new OleDbDataAdapter(com); 
     DataSet data = new DataSet(); 
     conn.Open(); 
     adapter.Fill(data); 

     conn.Close(); 
     dataGridView1.DataSource = data.Tables[0]; 
    } 

Więc zasadniczo, chciałbym zrobić to, co zrobiłem powyżej, ale chcę to dane z inna tabela też. Druga tabela ma również pole klucza ISBN i zawiera wartości numeru ISBN pasujące do pierwszej tabeli.

+2

Witam @Jeff i witam w StackOverflow. Chcemy pomóc, ale chcemy również zobaczyć, co do tej pory otrzymaliście. Czy możesz podać nam przykład niektórych danych i jak to jest obecnie? Zwróć uwagę na pokazywanie problematycznych części. Możemy po prostu powiedzieć "zrób lewe dołączenie", ale to ci nie pomoże. – jcolebrand

+0

Zgoda, jeśli pracujesz z bazami danych w języku C#, istnieje cały wszechświat możliwych rozwiązań, każdy z własnymi mocnymi i słabymi stronami. Możesz na przykład zbadać LINQ do rozwiązania SQL lub Entity Framework zamiast przejść do surowego SQL. Być może widziałeś przykłady tych technologii, dlatego uważasz, że "polecenia w języku C# mogą różnić się od zwykłych zapytań SQL". Zapewniamy, że język C# obsługuje "normalny" kod SQL za pośrednictwem ADO.net, ale obsługuje on znacznie więcej, w tym kwerendy jako obiekty języka pierwszej klasy za pośrednictwem LINQ. Wyruszasz w ekscytującą podróż! :) –

+0

Oprócz mojego przykładu, który właśnie napisałem, zdecydowanie zgadzam się z Jamesem. Jest wiele możliwości i powinieneś zrobić kilka badań i prób, aby zobaczyć, które rozwiązanie jest najlepsze w twoim przypadku. – KBoek

Odpowiedz

3

zajrzeć do wykorzystania JOIN powrotu wyniki z dwóch tabel JOIN ed razem ON pewne wspólne wartości

Patrz także

Nic nie ograniczając tego do C# lub OLEDB - to podstawowy SQL.


Do specyfiki co pytasz zapytanie może wyglądać następująco:

SELECT T1.ISBN, T1.color, T1.size, T2.weight 
FROM table1 T1 
    INNER JOIN table2 T2 
    ON T1.ISBN = T2.ISBN 
WHERE ISBN = '12345'; 

(Nie ma potrzeby, aby alias tabela1 jako T1 - Właśnie tak, że jako przykład; w bardziej skomplikowanych zapytaniach z dłuższymi nazwami tabel, możesz nie chcieć powtarzać nazwy tabeli przez cały czas)

  • ponieważ ISBN występuje w obu tabelach, musi być jawnie zakwalifikowany w wybranych polach; można użyć T1 lub T2, ponieważ są one identyczne, ponieważ kolor, rozmiar i waga występują tylko w jednej tabeli, NIE muszą być kwalifikowane - ale nie boli.
+0

Zgadzam się z tym sentymentem, on ma dwa tabele 1: 1 – jcolebrand

1
var query  = "SELECT t1.isbn, t1.color, t1.size, t2.weight FROM table1 t1 JOIN table2 t2 ON t2.isbn = t1.isbn"; 
var connection = new System.Data.SqlClient.SqlConnection("your SQL connection string here"); 
var dataAdapter = new System.Data.SqlClient.SqlDataAdapter(query, connection); 
var dataSet  = new System.Data.DataSet(); 

dataAdapter.Fill(dataSet); 

yourGridView.DataSource = dataSet; 
yourGridView.DataBind();

Jest to jedno z wielu rozwiązań. Myślę, że kod może być szybszy, jeśli utworzysz tabelę danych w pamięci i użyjesz SqlDataReader, ale powyższy przykład jest prostszy.

Podczas pracy z bazami danych MSSQL zwykle używasz klas System.Data.SqlClient. Jeśli - z jakiegokolwiek powodu - użyj OleDb, wybierz odpowiednie obiekty z przestrzeni nazw System.Data.OleDb.

+0

Ta składnia wygląda inaczej. Nie jestem pewien, co oznacza "t1.color". Czy to po prostu inny identyfikator dla table1? lub? – jeff

0

Można zapytania rekordy z obu tabel za pomocą UNION ALL

SELECT 'In table 1', book_author, book_title, book_isbn 
FROM books 
WHERE book_isbn = '67890' 
UNION ALL 
SELECT 'In table 2', othertable_author, othertable_title, othertable_isbn 
FROM othertable 
WHERE othertable_isbn = '67890' 

oczywiście trzeba ręcznie wypełnić „67890” w obu miejscach z wykorzystaniem dowolnej metody jest bardziej wygodny w danej sytuacji.

+0

lub mógłby dołączyć do wspólnego pola z pojedynczą klauzulą, gdzie klauzula – jcolebrand

+0

Nie jestem pewien, co jest w tym poleceniu "W tabeli 1". – jeff

+0

'w tabeli 1' - nie robi nic poza tym, że identyfikujesz rekordy z' table1' @jeff – Sathya

Powiązane problemy