gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:16:18 25 4
gpt4 key购买 nike

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

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 类中的 Final block ,因为它过早关闭了我的连接。然后我在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();
}
}

最佳答案

查看您的 getConnection() API,您正在finally block 中关闭连接。顺便说一句,我不明白为什么你要在 getConnection() 中执行 useStmt.executeUpdate();

关于java - JDBC 无法从单独的类连接到我的数据库。 DB 类创建连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com