2013-03-01 13 views
7

Jestem trochę zdezorientowany, jak uzyskać dane z bazy danych dostępu. Czy warto go najpierw zebrać na liście, a następnie pobrać te dane ze swojej listy, czy jest to w porządku, aby po prostu uzyskać je w bazie danych?Właściwy sposób uzyskiwania danych z bazy danych Access

Moje kody działają doskonale, ale chcę wiedzieć, czy jest lepszy sposób na zrobienie tego? :

private void button3_Click(object sender, EventArgs e) 
    { 
     OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\redgabanan\Desktop\Gabanan_Red_dbaseCon\Red_Database.accdb"); 
     connection.Open(); 
     OleDbDataReader reader = null; 
     OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='"+textBox8.Text+"'", connection); 
     reader = command.ExecuteReader(); 
     listBox1.Items.Clear(); 

     while (reader.Read()) 
     { 

      listBox1.Items.Add(reader[1].ToString()+","+reader[2].ToString()); 
     } 

     connection.Close(); 

* Otrzymuję moje dane bezpośrednio z bazy danych, a następnie wyświetlam je w skrzynce.

+0

Przygotuj się na nieobsługiwany wyjątek. – kiran

Odpowiedz

15

Jedną rzeczą, która wystaje jak ból kciuka jest SQL injection oraz wykorzystanie parametryzacji zapytań, np:

OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='@1'", connection); 

command.Parameters.AddWithValue("@1", textBox8.Text) 

Jaka jest twoja sprawka doskonale do przyjęcia, chociaż generalnie lepiej użyć SQL Baza danych.

Edit: Oto, w jaki sposób oddzielić logiki biznesowej z GUI:

Class BusLogic 
{ 
public List<string> ListboxItems = new List<string>(); 
public void PopulateListBoxItems(string userName) 
{ 
    string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\redgabanan\Desktop\Gabanan_Red_dbaseCon\Red_Database.accdb"; 
    using (OleDbConnection connection = new OleDbConnection(connString)) 
    { 
     connection.Open(); 
     OleDbDataReader reader = null; 
     OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='@1'", connection);    
     command.Parameters.AddWithValue("@1", userName) 
     reader = command.ExecuteReader();  
     while (reader.Read()) 
     { 
      ListboxItems.Add(reader[1].ToString()+","+reader[2].ToString()); 
     }  
    } 
}  
} 

GUI

private void button3_Click(object sender, EventArgs e) 
{   
     var busLogic = new BusLogic(); 
     busLogic.PopulateListBoxItems(textBox8.Text);   
     \\listBox1.Items.Clear(); 
     ListboxItems.DataSource = busLogic.ListboxItems; 
} 
+0

prawe, to jest bardzo podatne na iniekcję SQL, lepsze wykorzystanie parametrów AddwithValue :) – Pyromancer

+2

Dzięki. To wszystko, co chcę wiedzieć, że moje kody są w porządku. Użyłem teraz zapytań z parametrami. –

+0

Jeśli nie masz żadnych błędów, to dobrze :) – Pyromancer

1

Możesz oddzielić funkcje dostępu do danych w różnych klasach lub utworzyć ogólne funkcje do odzyskiwania rekordów.

+0

więc masz na myśli, że moja praca jest w porządku? –

+0

+1 Dzięki za to. Załączam kod demonstrujący to w mojej odpowiedzi: –

2

Powiedziałbym, że odpowiedź brzmi "tak" na jedno i drugie.

To, co teraz robisz, jest całkowicie dopuszczalne w prostych przypadkach. Po prostu pamiętaj, że nie "skaluje się" bardzo dobrze. Oznacza to, że ładowanie 10 lub 20 przedmiotów jest w porządku. Ale co się stanie, jeśli stanie się to 10 tysięcy lub milion?

W takim przypadku należy przyjrzeć się architekturze MVC (Model-View-Controller). Jest to temat sam w sobie, ale zasadniczo oddzielasz listbox ("widok") od danych ("model").

Zobacz this site for a C#-centric MVC discussion

pomiędzy nimi, co robisz teraz i pełnowymiarową architektury MVC, może po prostu chcesz zrobić jak sugerujesz - załaduj listę pierwszym następnie dodać je do listy. Nie zyskasz niczego, jeśli załadujesz go tylko raz, ale jeśli lista zostanie załadowana "wszędzie", możesz za każdym razem zapisać obciążenie bazy danych IO, uzyskując dostęp tylko raz.

Fakt, że zadałeś sobie pytanie, oznacza, że ​​jesteś na dobrej drodze.

+0

Dzięki. Bardzo docenione. –

2

Chociaż Twój kod działa bez problemu, proponuję wykonać jakiś obsługi wyjątków jak w this example, ponieważ zarówno OleDbConnection.Open() i OleDbCommand.ExecuteReader() może rzucić InvalidOperationException.

Powszechne jest również zawijanie połączenia za pomocą instrukcji using, więc na końcu connection.close() jest wywoływana automatycznie, ale jest to tylko osobisty wybór.

+0

+1 Dzięki za to. Załączam kod demonstrujący to w mojej odpowiedzi –

Powiązane problemy