13 Stimmen

SQLException: Kein Wert für Parameter 1 angegeben

Beim Ausführen meiner Anwendung ist folgender Fehler aufgetreten:

java.sql.SQLException: Kein Wert für Parameter 1 angegeben

Was bedeutet das?

Meine UserGroup Liste in meinem Dao:

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

Meine Liste der Benutzergruppen in meiner verwalteten Bean abrufen:

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

Meine JSF-Seite:

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

Meine Datentabelle ist in der Lage, die Liste der Gruppen aus der Datenbank anzuzeigen. Wenn ich jedoch eine einzelne Zeile in meiner Datentabelle auswähle, dauert es einige Zeit, bis die Anwendung eine Verbindung mit meiner Datenbank hergestellt hat, um das ausgewählte Ergebnis anzuzeigen.

Außerdem ist es seltsam, dass die Anwendung bestimmte ausgewählte Ergebnisse schneller anzeigen kann als andere. Hat das etwas mit der Ausnahme zu tun, auf die ich eingangs hingewiesen habe?

Fehler:

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)

15voto

BalusC Punkte 1034465

Es gibt keine solche Methode wie Connection() y getPreparedStatement() en java.sql.Connection .

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

En conn ist eindeutig eine selbstentwickelte Umhüllung von JDBC-Code. Ihr spezielles Problem wird wahrscheinlich durch den Code hinter der getPreparedStatement() Methode. Sie fügt offenbar eine ? in die SQL-Zeichenkette, bevor sie an die real connection.prepareStatement() Methode.

Sie wollen das wahrscheinlich nicht hören, aber Ihr JDBC-Ansatz ist völlig unbrauchbar. Dieses Design zeigt an, dass die JDBC Connection als statische oder Instanzvariable gehalten wird, die threadunsicher .

Sie müssen es völlig neu schreiben, so dass es auf die folgende ordnungsgemäße Verwendung und das Scoping von Variablen hinausläuft:

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

Siehe auch:


Unverwandt zur konkreten Frage, haben Sie ein anderes Problem. Die folgende Ausnahme

javax.el.ELException: /index.xhtml @61,99 value="#{usuariousGruposBean.listOfUserGroups}": Fehler beim Lesen von 'listOfUserGroups' auf Typ br.view.UsuariousGruposBean

zeigt an, dass Sie den JDBC-Kram innerhalb einer getter Methode anstelle der (Post)Konstruktor- oder (Action)Listener-Methode. Dies ist auch eine sehr schlechte Idee, da ein Getter während der Rendering-Antwort mehr als einmal aufgerufen werden kann. Korrigieren Sie es entsprechend.

Siehe auch:

3voto

Raidok Punkte 774

Normalerweise erhält man diese Art von Fehler, wenn man vorbereitete Anweisungen verwendet und vergessen hat, den Parameter mit Index 1 zu setzen.

In diesem Fall verwenden Sie vorbereitete Anweisungen, aber es gibt nichts vorzubereiten, Sie machen die Abfragezeichenfolge von Hand.

Außerdem können Sie auf zusätzliche Probleme stoßen, weil Sie eine Verkettung von Integer zwischen Apostrophen. Bei numerischen Werten werden sie weggelassen.

Es sollte also folgendermaßen ablaufen:

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

Aber eigentlich sollten Sie so etwas wie getStatement() verwenden oder getPreparedStatement() richtig einsetzen (setzen Sie ein ? an die Position von var und setInteger(), um sie dort zu platzieren.

Die endgültige Lösung würde also lauten:

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

2voto

oers Punkte 18070

Wenn Sie

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

Sie müssen

stmt.setInt(1, var);

vor

ResultSet rs = stmt.executeQuery();

So weisen Sie dem ersten Parameter (d. h. Parameter 1) einen Wert zu. Andernfalls wird eine Ausnahme auftreten.

0voto

zhuguowei Punkte 7743

Kürzlich habe ich auch dieses Problem, in meinem Fall habe ich jdbcTemplate batchUpdate-Methode verwendet, um Stapel einfügen Datensätze getroffen

void batchInsert(final List<EntryDataDO> doList) {
    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            final EntryDataDO dataDO = doList.get(i);
            if (dataDO == null){
                return;
            }
            ps.setString(1, dataDO.getId());
            ps.setString(2, dataDO.getDataCode());
            ...
        }

        @Override
        public int getBatchSize() {
            return doList.size();
        }
    });
}

Der Grund dafür ist, dass, wenn das erste Element von doList null ist, es direkt zurückgegeben wird und es zu Caused by: java.sql.SQLException: No value specified for parameter 1 aber wenn das erste Element nicht null ist, ist das batchUpdate in Ordnung, aber die Datensätze werden dupliziert, z.B. wenn das zweite Element null ist, wird der zweite den ersten Datensatz duplizieren

insert into t (id,...) values (1,...),(1,...),(3,...)

Die Lösung lautet also: 1. zuerst das Nullelement von doList ausschließen 2. dann batchInsert(doListWithoutNull) aufrufen, d.h.: Element inner nicht ausschließen org.springframework.jdbc.core.BatchPreparedStatementSetter#setValues

0voto

ResultSet rs = stmt.executeQuery();

Verwenden Sie diese Zeile nicht, bevor eine Operation durchgeführt wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X