2016-12-02 1 views
0

Делает ли готовый оператор внутри цикла for с переменными строками запроса каким-то образом его ломает?PreparedStatement не выполняется с правильным запросом

У меня есть это:

if(btn.equals("Continue")){ 
       String[] vals1 = request.getParameterValues("Vals"); 
       String count = ""; 
       queryStr = AniModel.deleteQuery(vals1); 
       PreparedStatement ps = conn.prepareStatement(queryStr); 
       int update = ps.executeUpdate(); 
       count = "" + update; 

        request.setAttribute("query",queryStr); 
        request.setAttribute("count",count); 
        RequestDispatcher dispatch = request.getRequestDispatcher("success4.jsp"); 
        dispatch.forward(request, response); 
      } 

Это занимает несколько элементов массива, в котором он использует на вызове DELETE запроса, который я создал:

public static String deleteQuery(String[] title){ 
    String qry="DELETE FROM AnimeDatabase WHERE "; 
    for(int i=0;i < title.length;i++){ 
     if (i>0) qry += " OR "; 
     qry += "ANI_TITLE='" + title[i] + "'"; 
    } 
    return qry; 
} 

Он получает массив значений из этого:

<% 



       String[] values = request.getParameterValues("cbg"); 
       int countme=0; 
       int numb=1; 
       for(int i=0;i < values.length;i++){ 
        countme++; 
        numb=countme; 

       %> 
       <tr><td><input type="hidden" name="Vals" value="<%out.println(values[i]);%>"id="vs_<%=(numb)%>"><%=values[i]%></td></tr> 
       <% 
        } 
      %> 

У этого есть правильный ввод запроса в конце, но его просто не выполняется обновление на базы данных.

EDIT: Я хочу достичь этого, когда я выполняю команду, он выполнит цикл и выполнит инструкции в зависимости от количества значений в массиве до его окончания.

Установите его на conn.setAutoCommit(false); и разместите conn.commit(); внутри блока кода Продолжить. Все еще не работает.

+0

Где вы принимаете? – JonK

+0

Вы должны называть 'conn.commit();' где-то в вашем коде, чтобы сохранить изменения в базе данных, если вы не вызвали 'setAutoCommit (true)' в соединении. Если вы не вызываете 'conn.commit();' и не включаете автосообщение ... это будет вашей проблемой. – JonK

+0

Я не знаю, где разместить фиксацию. Кроме того, обновлен код. Он просто не выполняет запрос. – Xenos29

ответ

1

Пар точек не зная, что вы на самом деле хотите добиться:

  1. Если вы хотите создать запрос для удаления записей вы можете не создать отдельный запрос, охватывающий критерии, чтобы выполнить его один раз?
  2. Вы случайно имеете проблему с транзакцией? Вы начинаете транзакцию?
  3. Если ваш запрос принимает параметры, я бы подготовил строку и инструкцию SQL за пределами цикла и в цикле задал параметры перед выполнением.
  4. Также убедитесь, что у вас нет других запросов или проблем в среде вокруг показанного кода.

Существует, однако, ничего плохого в вашей логике, и хотя я нахожу шаблон (3) немного быстрее из своего опыта, я не вижу прямой проблемы с кодом прямо сейчас.

(однако есть и другие проблемы, например счет, например, строка, но это может быть проблема с именами. Хотя обновление вернет число, поэтому вы снова конвертируете в строку, но на самом деле ничего не делаете со счетчиком var, который по существу будет содержать только ваше последнее количество строк, выполненное в строковом формате)

Для варианта 1 (и вашего редактирования). Есть место для оптимизации:

String[] vals1 = request.getParameterValues("Vals"); 
int count = 0; 
String sql = "DELETE FROM AnimeDatabase WHERE "; 

for(int i=0; i < vals1.length; i++) { 

    if (i>0) sql += " OR "; 
    sql += "ANI_TITLE='" + vals1 + "'"; 

} 

PreparedStatement ps = conn.prepareStatement(sql); 
int update = ps.executeUpdate(); 
count = update; 
+0

Редактировать мое сообщение для вас – Xenos29

+0

Обновлено мой ответ – George

+0

Его возвращение ошибки приведения: Целое не может быть передано в String. Исправлено, изменив счетчик снова на String. Но он все еще не выполняет запрос. – Xenos29

Смежные вопросы