2013-08-07 20 views
5

Ich habe eine Tabelle mit "SEMESTER, THEMA, ANGEBOT, ERGEBNIS" wo "SEMESTER" & "SUBJECT" ist PRIMÄRSCHLÜSSEL. Wenn ich die Abfrage verwendeC# OleDb Exception "Kein Wert für einen oder mehrere erforderliche Parameter angegeben" beim Versuch, aus Access-Datenbank zu löschen

"DELETE FROM Course_Information WHERE Semester = 1 AND Subject = 'CSE-414' ;

Seine perfekt in Access-Datenbank arbeiten, aber ich Ausnahme immer, wenn ich versuche, es in meinem C# -Code zu verwenden.

Außerdem seine Werke, wenn ich verwende „FROM Course_Information DELETE WHERE Semester = 1;

ich verwenden möchte, beide "SUBJECT" & "SEMESTER" In der Bedingung, dass (Da es unterschiedliches Thema im gleichen Semester sein könnte

)

meinen Code anzeigen,

connection_string = aConnection.return_connectionString(connection_string); 
      string sql_query = "DELETE FROM Course_Information WHERE Semester = " + this.textBox1.Text + " AND Subject = " + this.textBox2.Text + " ;"; 

      OleDbConnection connect = new OleDbConnection(connection_string); 
      OleDbCommand command = new OleDbCommand(sql_query, connect); 
      try 
      { 
       connect.Open(); 
       OleDbDataReader reader = command.ExecuteReader(); 
       MessageBox.Show("Delete Successful!"); 
       connect.Close(); 
       UpdateDatabase(); 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

Antwort

7

Fügen Sie die Anführungszeichen um den Wert, den Sie von this.textBox2.Text wie in Ihrer Arbeitsbeispielabfrage erhalten.

Stellen Sie sich vor this.textBox2.Text enthält den Text foo. Ohne das Hinzufügen dieser Anführungszeichen in der WHERE-Klausel würde die db-Engine ... WHERE Semester = 1 AND Subject = foo sehen. Aber in der Datenquelle mit dem Namen foo kann nichts gefunden werden, also wird davon ausgegangen, dass es ein Parameter sein muss. Sie benötigen die Anführungszeichen, um der db-Engine zu signalisieren, dass es sich um einen String-Literalwert handelt, 'foo'.

Wenn Sie tatsächlich zu einer Parameterabfrage wechseln, können Sie diese Art von Problem vermeiden, da Sie sich nicht mit den Anführungszeichen in der DELETE-Anweisung beschäftigen müssen. Und eine Parameterabfrage schützt Sie auch vor SQL-Injection. Wenn ein böswilliger Benutzer 'ODER' a '=' a in this.textBox2.Text eingeben kann, werden alle Zeilen in der Tabelle gelöscht.

+0

ES FUNKTIONIERT! : D Kann das nicht glauben, nur weil es nicht funktioniert hat! Danke vielmals! – user2594788

+4

Sie sollten trotzdem zu den vorgeschlagenen Parametern wechseln. Mit diesem Code öffnen Sie Ihre Datenbank für jeden Benutzer Ihrer Anwendung – Linky

0

Wenn Sie einen gleichen Fehler bekam für „Einfügen“ abfragen Sie diese Methode für vermeiden Ausnahme verwenden können

string sqlQuery = "INSERT into EndResultOfTestCases(IDsOfCases,TestCaseName,ResultCase,ResultLog) VALUES(@ids, @casename, @results, @logs)"; 

     connection = new OleDbConnection(connectionStringToDB); 
     command = new OleDbCommand(sqlQuery, connection); 
     command.Parameters.AddWithValue("@ids",IDs); 
     command.Parameters.AddWithValue("@casename", CaseName); 
     command.Parameters.AddWithValue("@results", resultOfCase); 
     command.Parameters.AddWithValue("@logs", logs); 
     connection.Open(); 
     command.ExecuteNonQuery(); 
     connection.Close(); 
    }