preparedStatement.setNull(int parameterIndex,int sqlType)

问题描述 投票:5回答:2

问题1

[任何人都可以告诉我,当sPhoneExtnull时,使用以下代码可以获得什么好处?

if (sPhoneExt == null || sPhoneExt.trim().equals("")) {
    stmt.setNull(9, java.sql.Types.INTEGER);
} else {
    stmt.setString(9, sPhoneExt);
}

而不是stmt.setString(9, sPhoneExt);

因为如果值是SQL iPhoneType = rset.getInt("phone_type");,则0将返回NULL;我不要


问题2

只是好奇地执行了stmt.setString(9, null),将返回rset.getInt("phone_type")是什么?

答案#2

getInt()在DB中为空时将返回零。您必须使用以下代码来了解DB NULL

if (rs.wasNull()) {
    // handle NULL field value
}
jdbc
2个回答
16
投票

在此String情况下,使用setNull没有任何好处。它仅用于检查空字符串“”,并在DB中插入null。但是为此,我们也可以像stmt.setString(9, null);

但是当sPhoneExt为Integer并保持null时,我们将无法执行由于stmt.setInt(9, sPhoneExt); API会执行setInt(int, int);将(取消装箱)sPhoneExt(整数)转换为原始形式(整数),因此您将获得NullPointerException。因此,您需要stmt.setNull(9, java.sql.Types.INTEGER);

最后,如果您在NUMBER(SQL类型)列的DB中插入了null; getInt()将仅返回0。

这与下面的空集机制无关。

stmt.setString(9, null);
stmt.setNull(9, java.sql.Types.INTEGER)

也有人告诉DB NUMBER列何时具有默认值;上面的两行将以不同的方式考虑默认值。但这不是事实。即使是这种情况,以上两行的执行方式也相同。正在设置NULL值;不是默认值。

create table t1 (id number default 1 );
insert into t1 (id) values (2);
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class TestDB {
    public static void main(String args[]) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Connection con = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@10.201.32.92:1521:psprd1", "username", "password");
            String query = null;
            String l = null;
            ResultSet rset = null;
            int paramIndex = 1;
            query = "UPDATE t1 " + " SET id = ?";

            stmt = con.prepareStatement(query);
            stmt.setInt(paramIndex++, null);
            // stmt.setNull(1, java.sql.Types.INTEGER);
            stmt.executeUpdate();
            stmt.close();

            query = "select id from t1 ";
            stmt = con.prepareStatement(query);
            rset = stmt.executeQuery();
            rset.next();
            System.out.println(rset.getString("id"));
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                rs.close();
                stmt.close();
                con.close();
            } catch (Exception e) {
                e.printStackTrace();

            }
        }
    }
}

0
投票

[stmt.setNull(9, java.sql.Types.INTEGER) Esto me fue muyútil。

Puesrequeríainsertar un valor nulo en un integer y de esta forma lo pude agregar a la base de datos。 Utilizando un更新或插入。

public synchronized String agregarHorario(Horarios h) {
    System.out.println("clases.Datos.agregarHorario()");
    try {
        String sql = "update or insert into T_HORARIOS (IDHORARIO, DESCRIPCION, "
                + "INGRESO, ALMUERZO, REINGRESO, SALIDA, TOLERANCIA, ESTADO) "
                + "values (?, ?, ?, ?, ?, ?, ?, ?) "
                + "matching(IDHORARIO)";
        try (PreparedStatement st = getConn().prepareStatement(sql,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY,
                ResultSet.HOLD_CURSORS_OVER_COMMIT)) {
            if(h.getIdHorario() != null){
                st.setInt(1, h.getIdHorario());
            }else{
                st.setNull(1, java.sql.Types.INTEGER);
            }
            st.setString(2, h.getDescripcion());
            st.setTime(3, h.getIngreso());
            st.setTime(4, h.getAlmuerzo());
            st.setTime(5, h.getReingreso());
            st.setTime(6, h.getSalida());
            st.setInt(7, h.getTolerancia());
            st.setBoolean(8, h.isEstado());

            st.executeUpdate();
            st.close();
        }
        return "Horario agregado correctamente!";
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, ex.getMessage());
        LOGGER.getLogger(Datos.class.getName()).log(Level.SEVERE, null, ex);
        return "Error al agregar horario, intente de nuevo!";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.