SQL异常:未为参数 1 指定任何值

2022-09-04 19:41:43

我在执行应用程序时遇到以下错误:

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;
}

我的受管 Bean 中的用户组的获取列表:

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)

答案 1

java.sql.Connection上没有这样的方法。Connection()getPreparedStatement()

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

它显然是围绕 JDBC 代码的自主包装器。您的特定问题可能是由该方法背后的代码引起的。它显然在将 a 附加到 SQL 字符串,然后再委派给 real connection.prepareStatement() 方法。conngetPreparedStatement()?

你可能不想听到这个,但是你的JDBC方法完全崩溃了。此设计指示 JDBC 作为静态或实例变量保存,这是线程不安全的Connection

您需要完全重写它,以便将其归结为以下正确的用法和变量范围:

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}”: 在 type br.view.UsuariousGruposBean 上读取 'listOfUserGroups' 时出错

表示您正在 getter 方法中执行 JDBC 操作,而不是(后)构造函数或(操作)侦听器方法。这也是一个非常糟糕的主意,因为在渲染响应期间可以多次调用 getter。相应地修复它。

另请参阅:


答案 2

通常,您在使用预准备语句时会遇到此类错误,并且忘记使用索引 1 设置参数。

在这种情况下,您使用的是预准备语句,但没有什么需要准备的,您可以手动创建查询字符串。

此外,您可能会遇到其他问题,因为您正在连接撇号之间的一个。数值没有它们。Integer

所以,它应该是这样的:

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

但实际上,您应该使用类似 getStatement() 之类的东西,或者正确使用 getPreparedStatement() (在 的位置放置一个 ?,然后 setInteger() 将其放入。var

因此,最终的解决方案是:

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

推荐