JDBC无法从单独的类连接到我的数据库。类DB创建连接

时间:2014-11-18 05:18:09

标签: java sql-server database jdbc prepared-statement

我一直试图让我的JDBC数据库连接从它自己的独立类(DB.java)执行,这样每当我想从我的任何其他多个类(例如CusTab.java)创建一个新连接时,我可以只创建一个DB实例。在运行我的第一个测试(包括将表内容打印到控制台)之后,我发现自己有一个错误:

Something wrong with prepared statement test
com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareStatement(SQLServerConnection.java:2166)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareStatement(SQLServerConnection.java:1853)
at marsPackage.CusTab.<init>(CusTab.java:129)

这是我的DB.java类,它启动与我的数据库KIS_DB的连接,它使用Windows身份验证,现在我的GUI在本地连接数据库。

package marsPackage;

import java.sql.*;

public class DB {

private Connection dbConn = null;

public Connection getConnection(){
    //This condition will check if the connection is not already open
    if (null == dbConn){
        //Setup a connection to the database
        String url = "jdbc:sqlserver://CoT-CIS3365-1\\MSSQLSERVER;databaseName=KIS_DB;integratedSecurity=true"; 
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            System.err.println("Class.forName thing is not working here");
            e1.printStackTrace();
        }
        try{
            dbConn = DriverManager.getConnection(url);

            PreparedStatement useStmt;
            try{
                useStmt = dbConn.prepareStatement("USE KIS_DB");
                useStmt.executeUpdate();
            }
            catch(SQLException e){
                e.printStackTrace();
            }
        }
        catch(SQLException e){
            System.err.println("There was a problem connecting to the Database");
            e.printStackTrace();
        }
        finally{
            if (dbConn != null)
                try{dbConn.close();} catch(SQLException e){e.printStackTrace();}
        }
    }
    return dbConn;
}
}

这是我将一个简单的结果集打印到控制台的测试,这来自CusTab.java类,因为这个类中的代码非常庞大,我将只输入我尝试使用我的数据库的片段。

            DB db = new DB();
        try {
            String sql = "SELECT * FROM PROJECT_STATUS;";
            PreparedStatement Stmt = db.getConnection().prepareStatement(sql);
            ResultSet rs = Stmt.executeQuery();
        while(rs.next()){
                System.out.println("PRO_STATUS_ID: "+rs.getString(1));
                System.out.println("PRO_STATUS_NAME: "+rs.getString(2));    
        }
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            System.err.println("Something wrong with prepared statement test");
            e1.printStackTrace();
        }

我提前感谢你的时间。

更新:@ppuskar建议我能解决这个问题。我删除了DB类中的Finally块,因为它过早地关闭了我的连接。然后我向DB.java添加了一个close()方法,此方法在使用时关闭连接。

/*
        finally{
            if (dbConn != null)
                try{dbConn.close();} catch(SQLException e){e.printStackTrace();}
        }*/
    }
    return dbConn;
}

public void close(){
    try {
        dbConn.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        System.err.println("Could not close the connection");
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

查看你的getConnection()API,你正在关闭finally块中的连接。顺便说一句,我不明白为什么你在getConnection()

中执行useStmt.executeUpdate();