2013-08-07 24 views
5

Mam tabelę z "SEMESTR, PRZEDMIOT, OFERTA, WYNIK", gdzie "SEMESTR" & "PRZEDMIOT" jest KLUCZEM PODSTAWOWYM. Gdy używam kwerendyC# OleDb Wyjątek "Brak wartości dla jednego lub więcej wymaganych parametrów" podczas próby usunięcia z bazy danych Access

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

Its doskonale działa w bazie danych dostępu, ale zawsze uzyskać wyjątek, gdy próbowałem go używać w moim kodu C#.

Ponadto swoje prace, jeśli mogę użyć „DELETE FROM Course_Information GDZIE Semestr = 1;

chcę użyć zarówno«osobnik»&«Semestr»W WHERE warunek (Bo nie mógł być inny przedmiot w tym samym semestrze)

Zobacz mój kod,

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

Odpowiedz

7

Dołącz cudzysłowy wokół wartości można uzyskać z this.textBox2.Text jak w zapytaniu próbki robocze.

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

Wyobraź sobie, że this.textBox2.Text zawiera tekst foo. Bez dodawania tych cytatów w klauzuli WHERE aparat db zobaczyłby ... WHERE Semester = 1 AND Subject = foo Ale nie może znaleźć niczego w źródle danych o nazwie foo, więc zakłada, że ​​musi to być parametr. Aby zasygnalizować silnikowi bazy danych, należy podać wartość cudzysłowu, która jest literalną wartością łańcuchową: "foo".

W rzeczywistości, jeśli przełączysz się na zapytanie parametrów, możesz uniknąć tego typu problemu, ponieważ nie będziesz musiał zawracać sobie głowy tymi cytatami w instrukcji DELETE. Zapytanie parametrów chroni również przed iniekcją SQL. Jeśli złośliwy użytkownik może wprowadzić "OR" a "=" a w this.textBox2.Text, wszystkie wiersze w tabeli zostaną usunięte.

+0

TO DZIAŁA! : D Nie mogę w to uwierzyć tylko dlatego, że "to nie zadziałało! Wielkie dzięki! – user2594788

+4

Zastanów się jednak, czy nie zmienić parametrów zgodnie z sugestiami. Za pomocą tego kodu otwierasz bazę danych dla każdego użytkownika aplikacji – Linky

0

Jeśli masz ten sam błąd dla „insert” kwerendy można użyć tej metody powodują unikanie wyjątkiem

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