Получение ResultSet из ExecuteQuery () не выполняется должным образом - PullRequest
0 голосов
/ 30 марта 2012

Следующий блок кода - это тот, который я попытался разработать. Я установил тестовые проверки по всей моей странице JSP, и она не проходит 3.22, таким образом, заканчивая программу. Существует еще один набор отношений, которые необходимо закрепить ниже, но я предполагаю, что он не проходит.

Я использую PostgreSQL. Все извлекаемые данные взяты из HTML-формы (в основном это регистрационная форма).

Я получил первую INSERT для работы с таблицей Users, и она работает довольно хорошо. Следуя тому же синтаксису, я полагаю, что могу получить созданный идентификатор пользователя (он автоматически создается из отношения последовательности в моей схеме базы данных). Тем не менее, это не работает в плане планирования, когда я пытаюсь найти идентификатор пользователя из той же таблицы USers (из недавно созданного кортежа, который я сделал), поэтому я могу использовать его для создания новой строки Locations. Я пытался искать везде, и у меня нет идей. Нужно ли размещать этот блок на другой странице JSP? Другая связь? Закрыть и снова открыть соединение? Любые идеи были бы великолепны.

Спасибо!

<%@ page import="java.sql.*"%>
<%@ page import="java.lang.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>

<%@ page import="org.apache.commons.fileupload.FileUploadException" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="DbConnection"
             class="edu.bu.cs.cs460.photoshare.DbConnection">
    <jsp:setProperty name="DbConnection" property="*"/>
</jsp:useBean>

<%
out.println("test check 1");

String email = request.getParameter("email");
String password = request.getParameter("password");
String fname = request.getParameter("fname");
String lname = request.getParameter("lname");

int dob = Integer.parseInt(request.getParameter("dob"));

out.println("test check 2: " + email + " " + password + " " + fname + " " + lname + " " + dob);

try{
    PreparedStatement st_users = null;
    Connection myCon = null;
    out.println("test check 2.21");
    try {
       Context ctx = new InitialContext();
       if (ctx == null) {
        throw new RuntimeException("No Context");
       }
       DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres");
       if (ds == null) {
        throw new RuntimeException("Datasource not found");
       }
       myCon = ds.getConnection();
       if (myCon == null) {
        throw new RuntimeException("Could not get connection");
       }


      } catch (SQLException e) {
       throw new RuntimeException(e);
      } catch (NamingException e) {
       throw new RuntimeException(e.getMessage());
    }



    PreparedStatement getUID = null;    

    getUID=myCon.prepareStatement("SELECT MIN(\"user_id\") FROM \"Users\" as U WHERE \"U.email\" = ?");
    getUID.setString(1, email);
    out.println("test check 3.22");
    ResultSet rs = null;
    rs = getUID.executeQuery();

    out.println("test check 3.999");
    int userid = rs.getInt(1);

    getUID.close();

    //String tempuserid = (String)rs.getAttribute(1);
    //int userid = rs.getInt(1);
    //sint userid = Integer.parseInt(tempuserid);

    out.println("test check 4: " + userid);
    /* now we have the ID from the set  */

    /* this will set the location tabe now for the registered user */

    PreparedStatement st_loc = null;

    st_loc=myCon.prepareStatement("INSERT INTO \"Locations\" (\"user_id\", \"curLoc\", \"hcity\", \"hstate\", \"country\") VALUES (?, ?, ?, ?, ?)");

    String hcity = request.getParameter("city");
    String hstate = request.getParameter("state");
    String curLoc = " ";
    String country = request.getParameter("country");

    out.println("test check 5: " + hcity + " " + hstate + " " + curLoc + " " + country);

    st_loc.setInt(1, userid);
    st_loc.setString(2, curLoc);
    st_loc.setString(3, hcity);
    st_loc.setString(4, hstate);
    st_loc.setString(5, country);   

    st_loc.executeUpdate();

    out.println("test check 6:");
    st_loc.close();
    myCon.close();
    out.println("Data is successfully inserted into database.");
}
catch(Exception e){
    System.out.println(e);

}

%>

1 Ответ

0 голосов
/ 30 марта 2012

Основная проблема, которую я вижу, заключается в том, что вы без необходимости цитируете имена таблиц и столбцов в своих запросах.Например:

"SELECT MIN(\"user_id\") FROM \"Users\" as U WHERE \"U.email\" = ?"

... будет работать намного лучше, как:

"SELECT MIN(user_id) FROM Users as U WHERE U.email = ?"

Обратите внимание, что это относится и к вашему выражению INSERT.И почему вы используете MIN(user_id)?Вы разрешаете одному адресу электронной почты иметь несколько учетных записей?Потому что это, вероятно, не тот подход, который вам нужен.

Кроме того, непонятно, что вы имеете в виду, когда говорите: «У меня работает первая ВСТАВКА».В вашем коде есть только один оператор INSERT, и он идет после оператора SELECT.Вы имеете в виду, что где-то еще у вас есть код, который вставляет строку в таблицу Users, и вы уверены, что она верна?

Некоторые общие рекомендации:

  1. Не помещайте Java-код в ваши файлы JSP.В частности, бизнес-логике, связанной с установлением соединения с базой данных и построением и выполнением запросов, не место в JSP.JSP предназначены для предоставления интерфейса / представления вашего веб-приложения, а не для размещения его основной бизнес-логики.

  2. Рассмотрите возможность использования инфраструктуры ORM, такой как Hibernate.Скорее всего, вы обнаружите, что работать с ним гораздо приятнее, чем с JDBC-запросами, созданными вручную.

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