Запрос SQL в файле JSP, извлекающий переменную из файла VXML - PullRequest
0 голосов
/ 14 марта 2010

Я пытаюсь заставить запрос SQL работать в файле JSP. Файл JSP вытягивается файлом VXML, вот мой код файла JSP:

<?xml version="1.0"?>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.*" %>
<% boolean success = true; // Always optimistic
 String info = "";
 String schoolname = request.getParameter("schoolname");
 String informationtype = request.getParameter("informationtype");

 try {
        Class.forName("org.postgresql.Driver");
        String connectString = "jdbc:postgresql://localhost:5435/N0176359";
        String user = "****";
        String password = "*****";
        Connection conn = DriverManager.getConnection(connectString, user, password);
        Statement st = conn.createStatement();
  ResultSet rsvp = st.executeQuery("SELECT * FROM lincolnshire_school_information_new WHERE school_name=\'"+schoolname+"\'");
        rsvp.next();
       info = rsvp.getString(2);
 }catch (ClassNotFoundException e) {
         success = false; // something went wrong
 }
%>

Как видите, я пытаюсь вставить значение переменной, объявленной как "schooname", в конец запроса SQL. Однако, когда я прихожу, чтобы запустить файл JSP, он не работает, и я получаю сообщение об ошибке «ResultSet не расположен правильно». Когда я помещаю стандартный запрос (не пытаясь установить значение переменной, он работает нормально)

Надеюсь, что это имеет смысл, и спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 15 марта 2010

Вы игнорируете результат ResultSet#next(), прежде чем пытаетесь получить доступ к столбцам строки. ResultSet#next() возвращает true, если есть строка, в противном случае false. Если вы попытаетесь получить доступ к несуществующей строке, вы получите исключение такого рода.

Итак, измените следующие две строки

    rsvp.next();
    info = rsvp.getString(2);

следующим образом:

    if (rsvp.next()) {
        info = rsvp.getString(2);
    }

Таким образом, код больше не будет пытаться получить доступ к несуществующей строке. Следующий вопрос, вероятно, будет таким: «почему он не вернул строку»? Ответ будет: «либо SQL-запрос неверен, либо строка фактически отсутствует в БД». Эта проблема лежит за пределами Java / JSP / JDBC. Отладьте запрос SQL (запустите отладчик или просто выполните System.out.println()) и скопируйте его без изменений в инструмент администратора БД и проверьте / выполните его. Могу поспорить, что эти лишние обратные слеши являются основной причиной проблемы, или что schoolname содержит символ, который необходимо экранировать.

Тем не менее, этот код не принадлежит файлу JSP. Он принадлежит к настоящему классу Java. Запустите изучение сервлетов , пока не стало слишком поздно. Также я хотел бы изучить JDBC еще раз на основе учебника Sun , ваш код JDBC именно утечка ресурсов. Вам необходимо освободить (закрыть) их после использования в блоке finally блока try по мере их приобретения. Также я бы использовал PreparedStatement вместо Statement, чтобы сохранить ваш код от SQL-инъекций . Вышеупомянутый учебник Sun также охватывает это.

0 голосов
/ 14 марта 2010

Выглядит нормально для меня, я подозреваю, что это как-то связано с передаваемым параметром - я предлагаю следующие шаги отладки:

1) Можете ли вы напечатать значение параметра schoolname и убедиться, что это то, что вы думаете?

2) Можете ли вы сформировать оператор SQL в переменной перед его выполнением и вывести его тоже?

Вы также можете проверить логическое возвращаемое значение вашего rsvp.next() вызова. Если это значение равно false, то по вашему запросу не было возвращено ни одной строки. (Javadoc для ResultSet.next () )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...