SQLException: ไม่ได้ระบุค่าสำหรับพารามิเตอร์ 1

ฉันพบข้อผิดพลาดต่อไปนี้ขณะดำเนินการแอปพลิเคชัน:

java.sql.SQLException: ไม่ได้ระบุค่าสำหรับพารามิเตอร์ 1

มันหมายความว่าอะไร?

รายการ UserGroup ของฉันใน 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;
}

รายการรับกลุ่มผู้ใช้ของฉันใน 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)

person ShaunK    schedule 18.11.2011    source แหล่งที่มา
comment
Error เกิดขึ้นที่บรรทัดไหน?   -  person oers    schedule 18.11.2011
comment
ข้อผิดพลาดเกิดขึ้นที่สองบรรทัดนี้: ResultSet rs = stmt.executeQuery(); และ List‹UsuariousGrupos› usuariosGruposList = userGrpDAO.select(var2);   -  person ShaunK    schedule 18.11.2011
comment
คุณแน่ใจหรือว่าการเลือกของคุณไม่ได้เลือก id_usuario, id_grupo จาก usuarios_grupos โดยที่ id_grupo = ? นี่จะอธิบายค่าที่หายไปสำหรับพารามิเตอร์ 1   -  person oers    schedule 18.11.2011
comment
อืม ฉันลองแล้วจริงๆ และฉันได้รับข้อผิดพลาดต่อไปนี้   -  person ShaunK    schedule 18.11.2011
comment
ข้อผิดพลาดใหม่ดูเหมือนจะเป็นปัญหาใหม่ บางทีคุณควรเปิดคำถามแยกต่างหากและยอมรับวิธีแก้ปัญหาสำหรับข้อยกเว้น sql ที่นี่   -  person oers    schedule 18.11.2011


คำตอบ (5)


สตริงวันที่ของคุณฮาร์ดโค้ดในเซลล์เช่นนั้นหรือไม่ ถ้าเป็นเช่นนั้นทำไม?
person BalusC    schedule 18.11.2011
comment
เฮ้ ขอบคุณสำหรับข้อมูลและความช่วยเหลือ! ฉันกำลังผ่านมันไปตอนนี้ ขออภัย ฉันยังใหม่ต่อการพัฒนาเว็บแอปพลิเคชัน JDBC และ Java - person ShaunK; 18.11.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);
person Raidok    schedule 18.11.2011
comment
เฮ้ ใช่ ฉันได้ลองสิ่งที่คุณแนะนำแล้ว อย่างไรก็ตาม ตอนนี้ฉันได้รับข้อยกเว้น nullpointer - person ShaunK; 18.11.2011
comment
การสร้างข้อความที่เตรียมไว้โดยไม่มีตัวยึดตำแหน่งไม่ใช่เรื่องเสียหาย - person BalusC; 18.11.2011

ถ้าคุณใช้

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

คุณต้อง

stmt.setInt(1, var);

ก่อน

ResultSet rs = stmt.executeQuery();

เพื่อกำหนดค่าให้กับพารามิเตอร์ตัวแรก (เช่น พารามิเตอร์ 1) ถ้าไม่ข้อยกเว้นของคุณจะเกิดขึ้น

person oers    schedule 18.11.2011
comment
รุนแรง: เกิดข้อผิดพลาดในการแสดงผลมุมมอง [/index.xhtml] javax.el.ELException: /index.xhtml @61,99 value=#{usuariousGruposBean.listOfUserGroups}: เกิดข้อผิดพลาดในการอ่าน 'listOfUserGroups' ในประเภท br.view.UsuariousGruposBean ที่ com.sun .faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) ที่ javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) ที่ javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182 ) - person ShaunK; 18.11.2011
comment
var2 คือรหัสที่ฉันเลือกเมื่อฉันเลือกแถว ฉันกำลังพยายามส่งผ่านไปยังวิธี select (Int var) ของฉันใน dao - person ShaunK; 18.11.2011

เมื่อเร็ว ๆ นี้ ฉันได้พบปัญหานี้เช่นกัน ในกรณีของฉันฉันใช้วิธี jdbcTemplateatchUpdate เพื่อแทรกบันทึกแบบแบตช์

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

เหตุผลก็คือ หากองค์ประกอบแรกของ doList เป็นโมฆะ และจะส่งกลับโดยตรง และจะทำให้ Caused by: java.sql.SQLException: No value specified for parameter 1 แต่หากไม่ใช่องค์ประกอบแรกเป็นโมฆะ การอัพเดตแบตช์ก็ใช้ได้ แต่บันทึกจะซ้ำกัน เช่น องค์ประกอบที่สองเป็นโมฆะ องค์ประกอบที่สองจะทำซ้ำบันทึกแรก

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

ดังนั้นวิธีแก้ไขคือ: 1. ก่อนอื่นให้แยกองค์ประกอบ null ออกจาก doList 2. จากนั้นเรียกแบตช์Insert(doListWithoutNull) กล่าวคือ: ไม่สามารถแยกองค์ประกอบภายใน org.springframework.jdbc.core.BatchPreparedStatementSetter#setValues ได้

person zhuguowei    schedule 04.01.2020

ResultSet rs = stmt.executeQuery();

อย่าใช้บรรทัดนี้ก่อนดำเนินการ

person Gautam Singh Rajput    schedule 13.05.2020
comment
สามารถใช้ ResultSet rs=new stmt.getResultSet(); วิธีการเท่านั้นที่ไม่ดำเนินการสอบถาม () - person Gautam Singh Rajput; 13.05.2020