小弟刚学JAVA中数据库的操作,但在使用事务时就遇到了一个问题,小弟愚昧,特求助于各位,谢谢!!当我在程序中加入事务处理后就报异常(错误指向关闭数据库连接的语句:conn.close();),如果去掉事务就运行正常.
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]无效的事务处理状态
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLDisconnect(JdbcOdbc.java:3034)
at sun.jdbc.odbc.JdbcOdbcDriver.disconnect(JdbcOdbcDriver.java:981)
at sun.jdbc.odbc.JdbcOdbcConnection.close(JdbcOdbcConnection.java:739)
at Myjdbc.main(Myjdbc.java:57)源代码如下
import java.sql.*;public class Myjdbc {
public static void main(String[] args) {
String url="jdbc:odbc:book";
Connection conn=null;
Statement stmt=null;
DatabaseMetaData bdmd=null;
ResultSet rs = null;
PreparedStatement pstmt=null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection(url, "sa", "sa");

conn.setAutoCommit(false);
stmt=conn.createStatement();
stmt.executeUpdate("delete from student");
stmt.executeUpdate("insert into student(sno,sname,sex,age) values('0001','tan谭','b',24)");
conn.commit();

bdmd=conn.getMetaData();
System.out.println(bdmd.getDatabaseProductName());
System.out.println(bdmd.getDatabaseProductVersion());
System.out.println(bdmd.getDriverName());
System.out.println(bdmd.getDriverVersion());

rs=stmt.executeQuery("select sno,sname,sex,age from student");
while (rs.next()){
System.out.println("name:"+rs.getString(2)+"   age:"+rs.getString(4));
}

pstmt=conn.prepareStatement("select sno,sname,sex,age from student where sno=?");
pstmt.setString(1, "0001");
rs=pstmt.executeQuery();
while (rs.next()){
System.out.println("name:"+rs.getString(2)+"   age:"+rs.getString(4));
}


} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
if(rs!=null)
   rs.close(); 
if (stmt != null){
    stmt.close();
}
if(conn != null && !conn.isClosed())
   conn.close();//使用事务后错误指向这里 } catch (SQLException e) {
e.printStackTrace();
}
} }}

解决方案 »

  1.   

    怎么没人理我啊,自己顶一下.
    刚刚我换了驱动(换成微软提供的JDBC驱动,不使用ODBC桥驱动)后这个问题就没有了
    为什么呢,是不是ODBC桥的问题呢,如果是的话,该如何解决啊?????
    各位大侠,请帮帮小弟!!
      

  2.   

    我连的是SQL2000,肯定是支持事务的
      

  3.   

    谢谢各位的关注与帮助!
    最近在外出差,不好意思.
    我用的是JDK5.0,ODBC桥驱动是SUN自带的,数据库是SQL2000sp4.这个问题我现在还没解决,急,请各位帮帮忙.
      

  4.   

    不是看数据库支持不支持事务,而是看驱动是不是支持事务,即使你的数据支持事务,而驱动程序不支持一样没用,所以说驱动尽量用各自数据库的,而不要用SUN自带的