SQLException: значение не указано для параметра 1 - PullRequest
8 голосов
/ 18 ноября 2011

Я столкнулся со следующей ошибкой при выполнении приложения:

java.sql.SQLException: значение не указано для параметра 1

Что это значит?

Мой UserGroup список в моем дао:

public List<UsuariousGrupos> select(Integer var) {
    List<UsuariousGrupos> ug= null;
    try {
        conn.Connection();
        stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo ='" + var + "'");
        ResultSet rs = stmt.executeQuery();
        ug = new ArrayList<UsuariousGrupos>();
        while (rs.next()) {
            ug.add(getUserGrupos(rs));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        conn.Disconnected();
    }
    return ug;
}

public UsuariousGrupos getUserGrupos(ResultSet rs) {
    try {
        UsuariousGrupos ug = new UsuariousGrupos(rs.getInt("id_usuario"), rs.getInt("id_grupo"));
        return ug;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

Мой список получения групп пользователей в управляемом компоненте:

public List<UsuariousGrupos> getListOfUserGroups() {
    List<UsuariousGrupos> usuariosGruposList = userGrpDAO.select(var2);
    listOfUserGroups = usuariosGruposList;
    return listOfUserGroups;
}

Моя страница JSF:

 <p:dataTable var="usergroups" value="#{usuariousGruposBean.listOfUserGroups}">
     <p:column headerText="" style="height: 0" rendered="false">
         <h:outputText value="#{usergroups.id_grupo}"/>
     </p:column>

Моя таблица данных может отображать список групп из базы данных. Однако, когда я выбираю отдельную строку в своей таблице данных, приложению требуется некоторое время для установления соединения с моей базой данных для отображения выбранного результата.

Также странно, что приложение может отображать некоторые выбранные результаты быстрее, чем другие. Имеет ли это какое-либо отношение к Исключению, которое я указал в начале?

Ошибка:

Disconnected
Connected!!
java.sql.SQLException: No value specified for parameter 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
    at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2462)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2216)
    at br.dao.UsuariousGruposDAO.select(UsuariousGruposDAO.java:126)
    at br.view.UsuariousGruposBean.getListOfUserGroups(UsuariousGruposBean.java:54)


SEVERE: Error Rendering View[/index.xhtml]
javax.el.ELException: /index.xhtml @61,99 value="#{usuariousGruposBean.listOfUserGroups}": Error reading 'listOfUserGroups' on type br.view.UsuariousGruposBean
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)

Ответы [ 3 ]

13 голосов
/ 18 ноября 2011

Не существует такого метода, как Connection() и getPreparedStatement() для java.sql.Connection.

conn.Connection();
stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo ='" + var + "'");

conn - явно доморощенная оболочка вокруг кода JDBC.Ваша конкретная проблема, вероятно, вызвана кодом, лежащим в основе метода getPreparedStatement().Очевидно, он добавляет ? к строке SQL, а затем передает его в метод real connection.prepareStatement().

Возможно, вы не хотите этого слышать,но ваш подход JDBC полностью нарушен.Этот дизайн указывает, что JDBC Connection хранится как статическая или переменная экземпляра, которая threadunsafe .

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

public List<UsuariousGrupos> select(Integer idGrupo) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<UsuariousGrupos> usuariousGrupos = new ArrayList<UsariousGrupos>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = ?");
        statement.setInt(1, idGrupo);
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            usuariousGrupos.add(mapUsuariousGrupos(resultSet));
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}

    }

    return usuariousGrupos;
}

См. Также:


Не связанный с конкретным вопросом, у вас другая проблема.Следующее исключение

javax.el.ELException: /index.xhtml @ 61,99 value = "# {usuariousGruposBean.listOfUserGroups}": Ошибка чтения списка listOfUserGroups для типа br.view.UsuariousGruposBean

означает, что вы выполняете JDBC внутри метода getter вместо (post) конструктора или метода (action) listener.Это также очень плохая идея, потому что геттер может вызываться более одного раза во время ответа рендера.Исправьте это соответствующим образом.

См. Также:

3 голосов
/ 18 ноября 2011

Обычно вы получаете такую ​​ошибку при использовании подготовленных операторов и забыли установить параметр с индексом 1.

В этом случае вы используете подготовленные операторы, но подготовить нечего, вы делаете запросстрока за рукой.

Кроме того, вы можете столкнуться с дополнительными проблемами, потому что объединяете Integer между апострофами.Числовые значения идут без них.

Итак, это должно быть так:

stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = " + var + ";");

Но на самом деле вы должны использовать что-то вроде getStatement () или использовать getPreparedStatement () правильно (поместите?в позиции var и setInteger (), чтобы поместить его в него.

Таким образом, окончательное решение будет:

stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = ?;");
stmt.setInt(1, var);
2 голосов
/ 18 ноября 2011

Если вы используете

stmt = conn.getPreparedStatement("select id_usuario, id_grupo 
  from usuarios_grupos 
  where id_grupo = ?);

Вам необходимо

stmt.setInt(1, var);

до

ResultSet rs = stmt.executeQuery();

Чтобы присвоить значение первому параметру (т.е. параметру 1),Если не ваше исключение произойдет.

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