一般检查sql语句就是将最终要发送的sql语句打印出来 在数据库中验证
但是在java web中使用prepareStatement只能看到一些带有“?”的语句 无法看到最终sql语句怎么样可以查看到String sql  = "UPDATE Question SET q_orientation=?,q_grade=?,q_type=?,q_cont=?,q_answer=?,q_rightAnswer=?,q_score=? WHERE q_id=?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, q.getQrientation());
pstmt.setString(2, q.getGrade());
pstmt.setString(3, q.getType());
pstmt.setString(4, q.getCont());
pstmt.setString(5, q.getAnswer());
pstmt.setString(6, q.getRightAnswer());
pstmt.setInt(7, q.getScore());
pstmt.setInt(8, q.getId()); 
pstmt.executeUpdate();现在进行pstmt.executeUpdate();之前看到 例如UPDATE Question SET q_orientation='程序基础',q_grade='初级',q_type='单选题',q_cont='面向对象是什么?',q_answer='A:继承(#)B:封装(#)C:多态(#)D:抽象',q_rightAnswer='ABC',q_score=5 WHERE q_id=21
这样的语句  怎么得到?谢谢

解决方案 »

  1.   

    如果是sql server的话,可以在企业管理器中用工具的[SQL 事件探查器]看到此SQL语句;
    还有一个笨办法,就是在执行executeUpdate前,编码将sql语句保存在一个String中,然后可以查看。
      

  2.   

    如果是sql server的话,可以在企业管理器中用工具的[SQL 事件探查器]看到此SQL语句;
    还有一个笨办法,就是在执行executeUpdate前,编码将sql语句保存在一个String中,然后可以查看。
      

  3.   

    如果是sql server的话,可以在企业管理器中用工具的[SQL 事件探查器]看到此SQL语句;
    还有一个笨办法,就是在执行executeUpdate前,编码将sql语句保存在一个String中,然后可以查看。
      

  4.   


    使用的是orcaleprepareStatement是JDBC中连接数据库的一个方法他对连接语句进行了封装 所以看不到有没有是么方法查看  主要是在开发时 查看最终操作数据库的SQL
      

  5.   

    这个不见得驱动的实现是拼接字符串再发送到服务器的。像SQLServer等都不是这样的处理,是调用服务器上的一个特定方法完成的所以你是没有办法获取这个SQL语句的
      

  6.   

    preparedstatment为了防止SQL注入 是不允许进行SQL的直接查询。我们可以通过配置LOG4J 让控制台打印输出SQL,还可以配置RESULTSET等。具体网上一大推 自己看吧
      

  7.   

    直接打印PreparedStatement对象就可以, 一般的数据库厂商对此接口的实现类里面都重写了toString()方法
      

  8.   

    if(params==null||params.length==0){
    return sql;
    }
    String [] args=new String[params.length];
    for(short i=0;i<params.length;i++){
    if(params[i]==null){
    args[i]="NULL";
    }else  if(params[i] instanceof Number){
    args[i]=String.valueOf(params[i]);
    }else  if(params[i] instanceof String){
    args[i]="'"+params[i].toString()+"'";
    }else if(params[i] instanceof Date){
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    args[i]="'"+sdf.format(params[i])+"'";
    }
    }
    StringBuilder dumpSql = new StringBuilder();
    int lastPos = 0;
    int Qpos = sql.indexOf('?', lastPos); // find position of first question
    // 
    int argIdx = 0;
    String arg; while (Qpos != -1) {
    // get stored argument
    try {
    arg = args[argIdx];
    } catch (IndexOutOfBoundsException e) {
    arg = "?";
    }
    if (arg == null) {
    arg = "?";
    } argIdx++;
     
    dumpSql.append(sql.substring(lastPos, Qpos)); // dump segment of sql
    // up to question
    // .
    lastPos = Qpos + 1;
    Qpos = sql.indexOf('?', lastPos);
    dumpSql.append(arg);
    }
    if (lastPos < sql.length()) {
    dumpSql.append(sql.substring(lastPos, sql.length())); // dump last
    // segment
    }
    return dumpSql.toString();用这个方法试试
      

  9.   

    数据库具体填充的参数是在数据库内部进行的,JDBC 取不到。
      

  10.   


    public static void main(String[] args) {
    String sql = "UPDATE Question SET q_orientation=?,q_grade=?,q_type=?,q_cont=?,q_answer=?,q_rightAnswer=?,q_score=? WHERE q_id=?)";
            List<String> list=new ArrayList<String>();
            list.add("程序基础");
            list.add("初级");
            list.add("单选题");
            list.add("面向对象是什么?");
            list.add(":继承(#)B:封装(#)C:多态(#)D:抽象");
            list.add("ABC");
            list.add("5");
            list.add("21");
    String resultSql=getExecuteSql(sql,list);
    System.out.println(resultSql);
    }
    public static String getExecuteSql(String sql,List<String> list){
    Matcher m=Pattern.compile("\\?").matcher(sql);
    int count=0;
    while(m.find()){
    sql=sql.replaceFirst("\\?","{"+count+"}");
    count++;
    }
    return MessageFormat.format(sql,list.toArray());
    }