public void delEmp(String ename) throws SQLException, ClassNotFoundException {
  String name = "test4";
  String sql = "delete from emp where ename=?";
  Db db = new Db();
  Connection con = db.getCon();
  PreparedStatement ps = null;
  
  //
  ps = con.prepareStatement(sql);
  ps.setString(1, name);
   ps.executeUpdate();
  con.commit();
  if(ps != null){
   ps.close();
  ps = null;
  con.close();
  con = null;
  }  
 }    
  我的目的是使用rs.setString(1,name)用name替换上面sql语句中的占位符,但是试了语句执行完了,但是数据库中的内容还在。  
  反复的试,最后试出如果直接把test4写入sql语句中是可以成功的,说明 rs.setString(1,name)这一句没有起作用。   
   
  但是运行的时候也没有报错。如果把 rs.setString(1,name)中的1写成0或者2都是会报错的。   
    
  
  后来访遍众多高手,他初怀疑是我的db那一层写的问题,于是远程控制给我看。  
  左看右看也没能解决,排除了代码的问题。  
  分析认为有可能三个地方有问题:
  1. jdbc驱动
  2. oracle
  3. jvm 
  
  差不多12:00了,于是把class12.jar驱动换成ojdbc14.jar驱动,重新试结果也是一样的。  
  
   -----------次日------------------------------  
   
  今天想想会不是是orcale 的问题,因为之前为了学oracle在上面改了不少东西,于是干脆重装系统,过程如下:
  1. 装好windows xp pro sp2。 
  2. 装好jdk1.5和jre1.5
  3. 装oracle10g
  4. 在环境变量的path中把jdk1.5的路径放到oracle path前面
  5. 导入装系统前备份下来的数据。 
  6. 安装myeclipse6.01
  7. 跑昨天有总是的代码
  8. 重点,问题依旧。  
   
  
---------再次日------------------------------------------------- 
  
  又把代码发给各位高手,在他们的环境下没有问题,只是在我的机器环境中就是不行,操作系统、jdk、oracle、myeclipse都已重装过,问题还是没有解决,请大家继续讨论一下。  
 
  项目代码可以到:http://u.115.com/file/f3e3c5cc56  下载。 
  
 
  .  
 
    . 

解决方案 »

  1.   

    ps = con.prepareStatement(sql);
      ps.setString(1, name);
    这一步下面可不可以打出 完整的sql语句到底最后是什么样子的。。
      

  2.   

    不好意思115的u盘要登录才能下载,新增一个下载地:   
    http://d.namipan.com/downfile/KO%E4%BC%97%E5%A4%9A%E9%AB%98%E6%89%8B%E7%9A%84jdbc%E9%97%AE%E9%A2%98.zip/3fd98bc3de6b95f6bbf5ac722f1c5f66e702c9bb73ab1600
      

  3.   

    不好意思115的u盘要登录才能下载,新增一个下载地:  
    http://d.namipan.com/downfile/KO%E4%BC%97%E5%A4%9A%E9%AB%98%E6%89%8B%E7%9A%84jdbc%E9%97%AE%E9%A2%98.zip/3fd98bc3de6b95f6bbf5ac722f1c5f66e702c9bb73ab1600
      

  4.   

    lz知道是怎么回事就可以了,类似这种情况我也遇到过,当时编完代码测试成功后就提交到客户那了,后来客户说有问题,但在我笔记本上就是好使的,比较诡异,后来同事帮我测试,在他们机器上不好使,但在我机器上完全通过。
    后来也遇到过这种情况,同事开玩笑说我笔记本兼容性好,可以兼容一切bug
      

  5.   

    int affectted_count = ps.executeUpdate();
    把这个affectted_count打出来吧,
    if (affectted_count > 0)
    {
        // delete成功
    }
    else
    {
        // delete失败 (我猜结果是这个)
    }
      

  6.   

    我怎么看你都是在用 name 而不是 ename,加班多了难免看花眼,所以你不应该经常工作到 12 点,睡觉去吧。public void delEmp(String ename) ...{
    String name = "test4";... 
    ps.setString(1, name);
      

  7.   

    你 JDBC 代码写得简直惨不忍睹,根本就不是 JDBC 的标准写法。JDBC 标准的写法:Connection con = null;
    PreparedStatement ps = null;
    try {
        con = ConnectionFactory.getConnection();
        String sql = ...;
        ps = con.preparedStatement(sql);
        ps.setXxxx...;
        ps.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if(con != null) {
            try { con.close(); } catch (SQLException e) { e.printStackTrace(); }
        }
        if(ps != null) {
            try { ps.close(); } catch (SQLException e) { e.printStackTrace(); }
        }
    }偷懒将导致吃尽苦头!另外,那个什么 Db 类,也存在大量的问题:import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;public class Db { String dbuser = "jsw";
    String dbpwd = "123456";
    Connection con = null; public Connection getCon() throws ClassNotFoundException{ //加驱动
    Class.forName("oracle.jdbc.driver.OracleDriver"); //获取连接
    try {
    con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.163:1521:orcl",dbuser,dbpwd);
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return con;
    }
    }1:不要将 Connection 设为成员变量,弄成成员变量,不会给你带来任何好处,只能带来无穷无尽而且还找不到为什么的麻烦(特别是在多线程并发的时候)。
    2:Class.forName 只要执行一次就够了,不用每次都运行一遍
      

  8.   


    差距在此!
    可以将只需执行一次的代码放在static{}静态代码区域中!
      

  9.   

      
     
      这里用String name = "test4";  ,只是为了测试不用?是否可用,并非是眼花了没有替换实参。 
      
      

  10.   

    没有更新成功,那就是没有commit了·有什么搞的??
      

  11.   

    可以LZ用得框架是起了全局事物的,如果connect 是框架中的,那么事物LZ提交了吗?
      

  12.   

    1.支持14楼的..
    2.我个人观点..我猜测是不是你的包import错误了?
      

  13.   

    1.支持14楼的..
    2.我个人观点..我猜测是不是你的包import错误了?
      

  14.   

      
      
    jdbc本身 con.setAutoCommit(true)的,为了保险,我还手工再写了一遍con.commit(); 
     
    提交没有问题,后来新建了一个项目,把代码重敲了一遍问题解决,但是之前的项目就是不行。