2016-12-21 2 views
1

Suche über die InqID funktioniert ordnungsgemäß, aber wenn ich den Code Suche mit InqName gibt es mir einen Fehler (alle Verbindungen gegeben Richtig, ich denke) Danke .. ERROR DETAILS An In System.Data.dll trat eine nicht behandelte Ausnahme vom Typ 'System.Data.OleDb.OleDbException' aufC# und Access Datenbank Suche über Name

Zusätzliche Informationen: Kein Wert für einen oder mehrere erforderliche Parameter angegeben.

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID=" +txtInqID.Text, CON); 
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = DS.Tables[0]; 

    CON.Open(); 
    DA.SelectCommand.ExecuteNonQuery(); 
    CON.Close(); 
} 

private void btnNameSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=" + txtInqName.Text, CON); 
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = DS.Tables[0]; 

    CON.Open(); 
    DA.SelectCommand.ExecuteNonQuery(); 
    CON.Close(); 
} 
+0

"SELECT * FROM INQUIREt WHERE InqName = '" + txtInqName.Text + "'", CON – jose

+1

@jose: Warum kümmert es dich nicht [injection] (http://www.w3schools.com/sql/sql_injection .asp)? –

Antwort

2

Die meisten Antworten Sie sagen, dass Sie Parameter verwenden sollten, und das ist gut. Sie sagen Ihnen auch, dass es korrekt wäre, wenn Sie einfache Anführungszeichen um es, die inkorrekt ist. Das Hinzufügen von einfachen Anführungszeichen ist KEINE Lösung und würde nur für einige Werte (gut viele, aber nicht alle) funktionieren und ist offen für SQL-Injection-Angriffe.

Es gibt nur einen Weg, es richtig zu machen und das ist die Verwendung von Parametern. Mit OleDb sind die Parameter NICHT benannt, sondern positionell. Bei Zugriff können Sie jedoch benannte Parameter verwenden, indem Sie ihnen @ voranstellen.

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE [email protected]", CON); 
    DA.SelectCommand.Parameters.Add("@ID", OleDbType.VarChar).Value = txtInqID.Text;  
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = null; 
    dataGridView.DataSource = DS.Tables[0]; 
} 

private void btnNameSearch_Click(object sender, EventArgs e) 
{ 
    DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE [email protected]", CON); 
    DA.SelectCommand.Parameters.Add("@name", OleDbType.VarChar).Value = txtInqName.Text; 
    DS.Clear(); 
    DA.Fill(DS); 
    dataGridView.DataSource = null; 
    dataGridView.DataSource = DS.Tables[0]; 
} 

PS: Du DataSet und Dataadapter in einer seltsamen Art und Weise verwenden, aber das ist akzeptabel und arbeitet.

0

Sie Anführungszeichen fehlen, die Ihre txtInqID.Text und InqName.Text Werte in Ihrer Anfrage beifügen:

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID = '" + txtInqID.Text + "'", CON); 

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName = '" + txtInqName.Text + "'", CON); 

auch dynamisch Ihre Abfrage-String wie das Gebäude ist ein very bad practice. Betrachten Befehl parameters statt:

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID = ?", CON); 
DA.SelectCommand.Parameters.Add("InqID").Value = txtInqID.Text; 

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName = ?" , CON); 
DA.SelectCommand.Parameters.Add("InqName").Value = txtInqName.Text; 
0

Sie sind nicht den Such-String-Parameter angeben, sollten Sie Anführungszeichen wie folgt hinzufügen:

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName='" + txtInqName.Text + "'", CON); 

jedoch den Aufbau der Query-String als string keine wirksame und gut lesbar ist Art und Weise, die gute Praxis ist OleDbParameters wie folgt zu verwenden:

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=?", CON); 
DA.SelectCommand.Parameters.AddWithValue("?", txtInqName.Text); 
0

Sie müssen den Wert umgeben von Name in Anführungszeichen, aber es wäre besser, Parameterized Sql zu verwenden.

DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE [email protected] " , CON); 
DS.Clear(); 
DA.SelectCommand.Parameters.AddWithValue("@Name",txtInqName.Text); 
DA.Fill(DS); 
dataGridView.DataSource = DS.Tables[0]; 

Auch brauchen Sie nicht unten Code als Daten, die bereits mit Dataadapter ausgewählt ist

CON.Open(); 
DA.SelectCommand.ExecuteNonQuery(); 
CON.Close();