SQLException: для параметра 1 Не задано значение


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

[5]}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 8

3 ответа:

Нет такого метода, как 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;
}

См. также:


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

Явакс.эль.ELException: / index.в XHTML @61,99 value= " #{usuariousGruposBean.listOfUserGroups}": Ошибка чтения 'listOfUserGroups' по типу br.вид.UsuariousGruposBean

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

См. также:

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

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

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

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

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

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

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

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

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

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

Вы должны

stmt.setInt(1, var);

До

ResultSet rs = stmt.executeQuery();

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