淹死的鱼pp 2017-11-06 02:44 采纳率: 57.1%
浏览 1083
已采纳

插入的sql语句因为数值不对应报错,怎么解决?

有一条sql插入语句,问号数比实际数要多,因为实际数不确定,所以我吧问号数写到最大,但有个问题,再插入实际数时有为null的数值,用PreparedStatement就无法执行,请问怎么完整的插入数据并不会报错?
public static void logToDB(String[] split) {
Connection conn=null;
PreparedStatement state=null;
JDBCUtilProperties.getValue("db.properties");//这是一个工具类
String sql = "insert into job values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try {
conn = JDBCUtilProperties.getConnection();
state= conn.prepareStatement(sql);
System.out.println("split=="+split.length);
for(int i =0;i< split.length;i++){
state.setString(i+1,split[i] );//这条语句因为数值的不对应老是报错
}
int rows = state.executeUpdate();
if(rows!=0){
System.out.println("插入成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
// 4. 释放资源
JDBCUtilProperties.releaseResource(conn, state, null);
}

}
  • 写回答

8条回答 默认 最新

  • zhc5885306 2017-11-06 03:12
    关注

    这是我的工具类

    package com.user.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    
    /**
     * JDBC工具类
     * @author zkc
     *  @version 1.0 2017-09-21
     */
    public class BaseDAO {
        /**
         * 连接对象
         */
        Connection conn = null;
        /**
         * 执行对象
         */
        PreparedStatement stmt = null;
        /**
         * 读取对象
         */
        ResultSet rs = null;
    
        /**
         * 获取连接对象
         * @return Connection
         */
        public Connection getConn(){
            try {
    //          Class.forName("oracle.jdbc.driver.OracleDriver");
    //          conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","zkc","123");
    
                Context ctx = new InitialContext();
    
                DataSource ds = (DataSource) ctx.lookup("java:comp/env/zkc");
    
                conn = ds.getConnection();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return conn;
        }
        /**
         * 增删改操作
         * @param sql
         * @param args
         * @return int
         */
        public int update(String sql,Object...args){
            int result = 0;
            try {
                conn = getConn();
                stmt = conn.prepareStatement(sql);
    
                for(int i=0;i<args.length;i++){
                    stmt.setObject(i+1, args[i]);
                }
    
                result = stmt.executeUpdate();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return result;
        }
    
        /**
         * 关闭对象
         */
        public void close(){
            try {
                if(rs!=null){
                    rs.close();
                }
                if(stmt!=null){
                    stmt.close();
                }
                if(conn!=null){
                    conn.close();
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }
    

    我这里的update方法就不用限定参数个数,传多少参数就有多少问号,下面是具体用的例子

    public boolean add(UserInfo user) {
            String sql = "insert into person values (?,?,?,?,?,?,?,?,?)";
            int result = update(sql,user.getAcc(),user.getPwd(),user.getName(),user.getSex(),user.getAge(),user.getIdcard(),user.getTel(),user.getAdd(),user.getEmail());
            boolean flag = true;
            if(result>0){
                System.out.println("添加成功");
                flag = true;
            }else{
                System.out.println("添加失败");
                flag = false;
            }
    
            close();
            return flag;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 多台相同IP产品如何组网
  • ¥30 关于php页面调取、更新数据提交刷新等问题
  • ¥50 使用 java+selenium 接管手动打开的IE浏览器
  • ¥15 ios 新安装app收不到fcm推送
  • ¥15 有没有实力的写手?有过成品的优先
  • ¥15 图像信息库的建立与识别
  • ¥15 韩国网站购物,KG支付的支付回调如何解决
  • ¥15 workstation导入ovf文件,报错,怎么解决呢?
  • ¥15 关于#c语言#的问题:构成555单稳态触发器,采用LED指示灯延时时间,对延时时间进行测量并显示(如楼道声控延时灯)需要Proteus仿真图和C语言代码
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,怎样解决呢?