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 下载。
.
.
ps.setString(1, name);
这一步下面可不可以打出 完整的sql语句到底最后是什么样子的。。
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
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
后来也遇到过这种情况,同事开玩笑说我笔记本兼容性好,可以兼容一切bug
把这个affectted_count打出来吧,
if (affectted_count > 0)
{
// delete成功
}
else
{
// delete失败 (我猜结果是这个)
}
String name = "test4";...
ps.setString(1, name);
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 只要执行一次就够了,不用每次都运行一遍
差距在此!
可以将只需执行一次的代码放在static{}静态代码区域中!
这里用String name = "test4"; ,只是为了测试不用?是否可用,并非是眼花了没有替换实参。
2.我个人观点..我猜测是不是你的包import错误了?
2.我个人观点..我猜测是不是你的包import错误了?
jdbc本身 con.setAutoCommit(true)的,为了保险,我还手工再写了一遍con.commit();
提交没有问题,后来新建了一个项目,把代码重敲了一遍问题解决,但是之前的项目就是不行。