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

插入的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;
    }
    
    点赞 打赏 评论
  • JavaBuilt 2017-11-06 02:45

    问号的数量必须和数据库中的列相对应。如果多出的列,则默认系统赋值为空。

    点赞 打赏 评论
  • 这是stan的博客 2017-11-06 02:48

    数据库中有多少个列,问号就得有多少个列,相对应才行

    点赞 打赏 评论
  • airfling 2017-11-06 02:48

    你先把所有的列数统计出来,然后拼接?到sql里面

    点赞 打赏 评论
  • 淹死的鱼pp 2017-11-06 02:51

    数据库中的列和问号的列是相对应的,没有多也没有少

    点赞 打赏 评论
  • qq_35699476 2017-11-06 03:03

    你的SQL语法有问题,而且要插入的值和字段位置要对应上!

    点赞 打赏 评论
  • 瞭望塔 2017-11-06 03:07

    传的参数值split[]数组里的字段和SQL里的字段对应上就没问题,如果缺省就有问题,null值就传空,只要不违反非空约束就可以

    点赞 打赏 评论
  • penguinDada 2017-11-06 03:37

    @airfling 的方法很好啊,传过来多少参数,就循环拼接问号,很简单的啊

    点赞 打赏 评论

相关推荐 更多相似问题