小弟刚学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();
}
} }}
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();
}
} }}
刚刚我换了驱动(换成微软提供的JDBC驱动,不使用ODBC桥驱动)后这个问题就没有了
为什么呢,是不是ODBC桥的问题呢,如果是的话,该如何解决啊?????
各位大侠,请帮帮小弟!!
最近在外出差,不好意思.
我用的是JDK5.0,ODBC桥驱动是SUN自带的,数据库是SQL2000sp4.这个问题我现在还没解决,急,请各位帮帮忙.