2009-07-23 8 views
0

Ich habe ein seltsames Problem. Meine Abfrage in C#/ASP.NET gibt Ergebnisse 5 Mal zurück. Ich habe versucht, eine Bremsspitze zu setzen, aber ich kann den Fehler nicht finden. Ich habe 2 verwandte Tabellen. Eine Tabelle wird auf PAGE_LOAD geladen, und wenn der Benutzer auf eine Zelle klickt, wird der Inhalt einer anderen Tabelle angezeigt, die sich auf diese Zelle bezieht. Es ist sehr einfach.Abfrage gibt Ergebnisse 5 mal zurück

//PAGE LOAD 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbpath + "/secure_user/data/data.mdb"); 
     OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT Project,Manager,Customer,Deadline FROM projects WHERE Username='" + uname + "'", myConnection); 
     DataTable table = new DataTable(); 
     adapter.Fill(table); 
     adapter.Dispose(); 
     GridView1.DataSource = table; 
     GridView1.DataBind(); 
    } 
} 

Es lädt die Projekttabelle in die GridView. Nun, wenn ich ein bestimmtes Projekt klicken, es weitere Informationen zu diesem Projekt zeigt:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    GridViewRow row = GridView1.SelectedRow; 
    Label1.Text = row.Cells[1].Text; 
OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbpath + "/secure_user/data/data.mdb"); 
    OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT tasks.Task,tasks.Priority,tasks.Done,taska.Hours FROM projects,tasks WHERE tasks.Username='" + uname + "' AND tasks.Project='" + Label1.Text + "'", myConnection); 
    DataTable table = new DataTable(); 
    adapter.Fill(table); 
    adapter.Dispose(); 
    GridView2.DataSource = table; 
    GridView2.DataBind(); 
    GridView2.Visible = true; 
} 

Es zeigt ohne Fehler, aber es hat 5 mal egal welches Projekt ich von GridView1 wählen, Der Inhalt der GridView2 (zweite Tabelle) wird 5 Mal hintereinander angezeigt. Was könnte das Problem sein?

+1

Es scheint einen Tippfehler in der zweiten SELECT-Anweisung (Taska) zu geben. – Svante

+2

Übrigens ist diese Art von Abfrage ein leichtes Ziel für Skriptangriffe; Bitte verwenden Sie den Inhalt editierbarer Felder nicht ohne Validierungen. –

+0

jemand muss über kleine Bobby Tische lesen ... –

Antwort

4

Sieht aus als ob Sie etwas falsch in Ihrer Abfrage haben. Versuchen Sie es mit INNER JOIN anstelle von,.

Statt dessen:

SELECT tasks.Task, tasks.Priority, tasks.Done, tasks.Hours 
FROM projects, tasks 
WHERE tasks.Username='" + uname + "' AND tasks.Project='" + Label1.Text + "' 

Versuchen Sie folgendes:

SELECT tasks.Task, tasks.Priority, tasks.Done, tasks.Hours 
FROM projects INNER JOIN tasks ON projects.ID = tasks.ProjectID --> may not be correct depends on your table structure 
WHERE tasks.Username='" + uname + "' AND tasks.Project='" + Label1.Text + "' 

Eine andere Sache: den Aufbau einer SQL-Abfrage wie das zu SQL Injection attack anfällig ist.

+0

wow, das funktioniert perfekt! vielen Dank! Ich wünschte, ich könnte dich abstimmen, aber ich vermisse weitere 14 Wiederholungen. Vielen Dank! Ich werde SQL Injection Prevention in Betracht ziehen. Dank euch allen. – user134570

0

Könnte sein, dass diese Abfrage mehrere Datensätze zurückgibt; können Sie Primärschlüssel in den verwendeten Tabellen auflisten

0

In Ihrer zweiten Abfrage haben Sie eine Art Join. Sie geben nie etwas in SELECT aus der Projekttabelle zurück, aber es wird in der Abfrage referenziert. Ich nehme an, dass Sie 5 Projekte haben.

Außerdem injizieren Sie Daten in die Abfrage. Dies ist schlecht, da es für einen Angreifer sehr einfach wird, einen SQL Injection-Angriff gegen Ihren Code und Ihre Datenbank zu starten, insbesondere, wenn Sie Daten direkt aus Steuerelementen verwenden. Sie sollten mindestens parametrisierte Abfragen verwenden.

+0

Ich verstehe das. Ich werde mehr über SQL-Injektion lesen. Vielen Dank. – user134570

0

Sie versuchen, zu Ihrer Abfrage DISTINCT-Klausel hinzuzufügen. Wenn es nicht angezeigt wird, hat Ihre Abfrage ein kartesisches Produkt erstellt.

OleDbDataAdapter adapter = neuer OleDbDataAdapter ("SELECT DISTINCT tasks.Task, Aufgaben.Priorität, tasks.Done, taska.Hours FROM Projekte, Aufgaben WHERE tasks.Username = '" + uname + "' AND tasks.Project = ' "+ Label1.Text +" '", myConnection);

+0

Ich habe das schon gelöst, aber ich werde das berücksichtigen. Vielen Dank. – user134570

1

Sie führen Cross-Join zwischen der Tabelle projects und der Tabelle tasks durch, sodass Sie jedem Projekt mit jeder Aufgabe für das ausgewählte Projekt beitreten. Wenn Sie fünf Projekte haben, erhalten Sie jede Aufgabe fünf Mal.

JOIN eine die Beziehung zwischen der projects Tabelle zu spezifizieren und die tasks Tabelle:

OleDbDataAdapter adapter = new OleDbDataAdapter(
    "SELECT tasks.Task,tasks.Priority,tasks.Done,taska.Hours "+ 
    "FROM projects "+ 
    "INNER JOIN tasks ON tasks.Project = projects.Project "+ 
    "WHERE projects.Username='" + uname + "' AND projects.Project='" + Label1.Text + "'", myConnection); 

Hinweis:
Beachten Sie, dass ich das Feld Benutzername eher in der projects Tabelle verwendet als die tasks Tabelle. Entweder haben Sie Redundanz in den Tabellen oder die Felder bedeuten unterschiedliche Dinge.Wenn ein anderer Benutzer Aufgaben zu Ihrem Projekt hinzufügen kann, benötigen Sie eine Bedingung für das Feld tasks.Username, auch wenn Sie nur die Aufgaben sehen möchten, die Sie selbst hinzugefügt haben.

+0

Danke Guffy, ich habe Adrians Lösung bereits benutzt. – user134570

+0

Siehe die Notiz, die ich hinzugefügt habe, gibt es einige Unterschiede von der Abfrage, Adrian vorgeschlagen ... – Guffa

Verwandte Themen