SQLException: Tidak ada nilai yang ditentukan untuk parameter 1

Saya mengalami kesalahan berikut ketika saya menjalankan aplikasi saya:

java.sql.SQLException: Tidak ada nilai yang ditentukan untuk parameter 1

Apa artinya?

Daftar UserGroup saya di dao saya:

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

Daftar grup Pengguna yang saya dapatkan di kacang yang saya kelola:

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

Halaman JSF saya:

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

Tabel data saya dapat menampilkan daftar grup dari database. Namun, ketika saya memilih satu baris dalam tabel data saya, aplikasi memerlukan beberapa waktu untuk membuat koneksi dengan database saya untuk menampilkan hasil yang dipilih.

Selain itu, anehnya aplikasi ini mampu menampilkan hasil pilihan tertentu lebih cepat dibandingkan yang lain. Apakah ini ada hubungannya dengan Pengecualian yang saya sebutkan di awal?

Kesalahan:

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 sumber
comment
di baris manakah kesalahan terjadi?   -  person oers    schedule 18.11.2011
comment
kesalahan terjadi pada dua baris berikut: ResultSet rs = stmt.executeQuery(); dan Daftar‹UsuariousGrupos› usuariosGruposList = userGrpDAO.select(var2);   -  person ShaunK    schedule 18.11.2011
comment
apakah anda yakin pilihan anda bukan pilih id_usuario, id_grupo dari usuarios_grupos dimana id_grupo = ?. Ini akan menjelaskan nilai yang hilang untuk parameter 1.   -  person oers    schedule 18.11.2011
comment
humm Saya sebenarnya mencobanya, dan saya mendapatkan kesalahan berikut.   -  person ShaunK    schedule 18.11.2011
comment
kesalahan baru sepertinya menjadi masalah baru. Mungkin Anda harus membuka pertanyaan terpisah untuk itu dan menerima solusi untuk pengecualian sql di sini.   -  person oers    schedule 18.11.2011


Jawaban (5)


Apakah string tanggal Anda diberi kode keras di sel seperti itu? Jika ya, mengapa?
person BalusC    schedule 18.11.2011
comment
Hai, terima kasih atas informasi dan bantuannya! Saya sedang melaluinya sekarang. Maaf, saya baru mengenal pengembangan aplikasi web JDBC dan Java - person ShaunK; 18.11.2011

Biasanya Anda mendapatkan kesalahan seperti ini saat menggunakan pernyataan yang telah disiapkan dan lupa menyetel parameter dengan indeks 1.

Dalam hal ini, Anda menggunakan pernyataan yang telah disiapkan tetapi tidak ada yang perlu dipersiapkan, Anda membuat string kueri dengan tangan.

Selain itu, Anda mungkin mengalami masalah tambahan karena Anda menggabungkan Integer di antara apostrof. Nilai numerik tidak berlaku tanpanya.

Jadi, seharusnya seperti ini:

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

Namun sebenarnya Anda harus menggunakan sesuatu seperti getStatement() atau menggunakan getPreparedStatement() dengan benar (tempatkan ? pada posisi var dan setInteger() untuk menempatkannya.

Jadi solusi akhirnya adalah:

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
Hei ya, saya sudah mencoba apa yang Anda sarankan. Namun, saya mendapatkan pengecualian nullpointer sekarang. - person ShaunK; 18.11.2011
comment
Tidak ada salahnya membuat pernyataan yang sudah disiapkan tanpa placeholder. - person BalusC; 18.11.2011

Jika Anda menggunakan

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

Kamu harus

stmt.setInt(1, var);

sebelum

ResultSet rs = stmt.executeQuery();

Untuk menetapkan nilai ke parameter pertama (yaitu Parameter 1). Jika tidak, pengecualian Anda akan terjadi.

person oers    schedule 18.11.2011
comment
PARAH: Kesalahan Rendering View[/index.xhtml] javax.el.ELException: /index.xhtml @61,99 value=#{usuariousGruposBean.listOfUserGroups}: Kesalahan membaca 'listOfUserGroups' pada tipe br.view.UsuariousGruposBean di com.sun .faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) dan javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) dan javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182 ) - person ShaunK; 18.11.2011
comment
baik var2 adalah id yang saya pilih ketika saya memilih baris. Saya mencoba meneruskannya ke metode pilihan saya (Int var) di dao. - person ShaunK; 18.11.2011

Baru-baru ini saya juga menemui masalah ini, dalam kasus saya, saya menggunakan metode jdbcTemplate batchUpdate untuk memasukkan catatan secara batch

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

Alasannya adalah jika elemen pertama doList adalah null dan akan langsung kembali dan akan menyebabkan Caused by: java.sql.SQLException: No value specified for parameter 1 tetapi jika bukan elemen pertama yang null, batchUpdate baik-baik saja tetapi catatan akan diduplikasi misalnya. elemen kedua adalah null, elemen kedua akan menduplikasi record pertama

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

Jadi solusinya adalah: 1. pertama-tama kecualikan elemen null dari doList 2. lalu panggil batchInsert(doListWithoutNull) artinya: tidak dapat mengecualikan elemen dalam org.springframework.jdbc.core.BatchPreparedStatementSetter#setValues

person zhuguowei    schedule 04.01.2020

ResultSet rs = stmt.executeQuery();

Jangan gunakan baris ini sebelum operasi dilakukan.

person Gautam Singh Rajput    schedule 13.05.2020
comment
dapat menggunakan ResultSet rs=new stmt.getResultSet(); hanya metode yang tidak mengeksekusi query() - person Gautam Singh Rajput; 13.05.2020