2013-03-01 13 views
7

Ich bin ein wenig verwirrt, wie man Daten aus einer Access-Datenbank bekommt. Ist es richtig, es zuerst in einer Liste zu sammeln, dann diese Daten von Ihrer Liste zu bekommen ODER es ist in Ordnung, es direkt in Ihre Datenbank zu bekommen?Korrekter Weg, um Daten aus einer Access-Datenbank zu erhalten

Meine Codes funktionieren einwandfrei, aber ich möchte wissen, ob es einen besseren Weg gibt, dies zu tun ?? :

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(); 

* Ich bekomme meine Datensätze direkt aus einer Datenbank und zeigt sie dann in einer Listbox an.

+0

Bracken Sie sich für unbehandelte Ausnahme. – kiran

Antwort

15

Eine Sache, die wie ein wunder Daumen ragt ist die SQL-Injection und Parametrierter Abfragen zu verwenden, zB:

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

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

Was dein Werk ist durchaus akzeptabel, auch wenn Sie in der Regel besser dran seien, eine SQL zu verwenden Datenbank.

Edit: Hier ist, wie Sie Ihre Geschäftslogik von der GUI trennen:

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

richtig zeigt, das ist sehr anfällig für SQL-Injektion, besser verwenden Sie Parameter AddwithValue :) – Pyromancer

+2

Danke. Das ist alles, was ich wissen möchte, dass meine Codes in Ordnung sind. Ich habe jetzt parametrisierte Abfragen verwendet. –

+0

Wenn Sie keine Fehler haben, ist das in Ordnung :) – Pyromancer

1

Sie können Ihre Datenzugriffsfunktionen möglicherweise in verschiedene Klassen aufteilen oder generische Funktionen zum Abrufen von Datensätzen erstellen.

+0

Sie meinen also, meine Arbeit ist in Ordnung? –

+0

+1 Danke dafür. Ich habe Code enthalten, der dies in meiner Antwort –

2

Ich würde sagen, die Antwort "Ja" ist beides.

Was Sie jetzt tun, ist in einfachen Fällen durchaus akzeptabel. Sei dir bewusst, dass es nicht sehr gut "skaliert". Das heißt, das Laden von 10 oder 20 Elementen ist in Ordnung. Aber was passiert, wenn es 10 Tausend oder eine Million wird?

In diesem Fall möchten Sie eine MVC-Architektur (Model-View-Controller) verwenden. Das ist ein Thema für sich, aber im Grunde entkoppeln Sie die Listbox (die "Ansicht") von den Daten (das "Modell").

Siehe this site for a C#-centric MVC discussion

Dazwischen, was Sie jetzt tun, und eine ausgewachsene MVC-Architektur, können Sie einfach tun wollen, wie Sie vorschlagen - laden Sie die Liste zunächst fügen Sie sie dann in das Listenfeld. Das bringt Ihnen nichts, wenn Sie es nur einmal laden, aber wenn die Liste "überall" geladen wird, können Sie den IO-Overhead der Datenbank jedes Mal speichern, indem Sie nur einmal darauf zugreifen.

Die Tatsache, dass Sie die Frage gestellt haben, zeigt an, dass Sie auf dem richtigen Weg sind.

+0

Vielen Dank. Sehr geschätzt. –

2

Obwohl Ihr Code funktioniert ohne Probleme, schlage ich Ihnen einige Ausnahmebehandlung wie in this example, da sowohl OleDbConnection.Open() und OleDbCommand.ExecuteReader() ausführen könnte eine InvalidOperationException werfen.

Es ist auch üblich, die Verbindung mit einer using Anweisung zu wickeln, so dass am Ende connection.close() automatisch aufgerufen wird, aber das ist nur eine persönliche Vorliebe.

+0

+1 Danke dafür. Ich habe Code in meine Antwort eingefügt –

Verwandte Themen