2013-08-07 11 views
5

Ho una tabella con "SEMESTRE, SOGGETTO, OFFERTA, RISULTATO" dove "SEMESTRE" & "SOGGETTO" è PRINCIPALE. Quando uso la queryEccezione CD OleDb "Nessun valore assegnato per uno o più parametri richiesti" durante il tentativo di eliminazione dal database di Access

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

sua perfettamente funzionante nel database di Access, ma ottengo sempre un'eccezione quando ho provato ad usarlo nel mio codice C#.

Inoltre le sue opere se io uso "DELETE FROM Course_Information DOVE Semestre = 1;

voglio usare entrambi 'OGGETTO' & 'semestre' Nella condizione WHERE (Perché ci potrebbe essere soggetto diverso nello stesso semestre)

Vedere il mio codice,

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

risposta

7

Includere le virgolette attorno al valore che si ottiene da this.textBox2.Text come nella vostra query di esempio di lavoro.

" AND Subject = '" + this.textBox2.Text + "';"; 

Imagine this.textBox2.Text contiene il testo pippo. Senza aggiungere tali citazioni nella clausola WHERE il motore db vedrebbe ... WHERE Semester = 1 AND Subject = foo ma non riesce a trovare nulla nell'origine dati denominata foo, quindi presuppone che debba essere un parametro. Hai bisogno delle virgolette per segnalare il motore db è un valore letterale stringa, 'pippo'.

In realtà se si passa a una query con parametri, è possibile evitare questo tipo di problema perché non sarà necessario infastidire tali citazioni nell'istruzione DELETE. E una query con parametri ti proteggerà anche dall'iniezione SQL. Se un utente malintenzionato può inserire 'OPPURE' a '=' a in this.textBox2.Text, tutte le righe nella tabella verranno eliminate.

+0

FUNZIONA! : D Non ci posso credere solo per il fatto che non ha funzionato! Molte grazie! – user2594788

+4

Considerare comunque di passare ai parametri come suggerito. Con questo codice apri il tuo database ad ogni utente dell'applicazione – Linky

0

Se hai un stesso errore per "inserire" interrogare è possibile utilizzare questo metodo per evitare di eccezione

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