有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

sql server Java jdbc无法插入到数据库

我有两个类连接到DemoResultSet。问题是当我运行插入2次时()。然后只向数据库插入一条记录。第二个insert create错误:"Error:The connection is closed."。所以当我取消注释close() statement时。它跑得很好。我不知道有什么问题。有人能给我一些建议吗

public class ConnectionUtil {

    private static String url = "jdbc:sqlserver://localhost:1433;databaseName=Northwind";
    private static String username = "user";
    private static String pw = "pass";
    private static Connection conn = null;

    static {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ConnectionUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static Connection getConnection() {
        if (conn == null) {
            try {
                conn = DriverManager.getConnection(url, username, pw);
            } catch (SQLException ex) {
                Logger.getLogger(ConnectionUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return conn;
    }
}

public class DemoResultSet {

    private static ResultSet rs = null;
    private static Connection conn = null;

    public static void initialize() {
        try {
            conn = ConnectionUtil.getConnection();
            Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE );
            String sql = "select CategoryID, CategoryName from Categories";
            rs = statement.executeQuery(sql);
        } catch (SQLException ex) {
            Logger.getLogger(DemoResultSet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        initialize();
        insert();
        insert();
    }

    public static void insert() {
        try {
            rs.moveToInsertRow();
            rs.updateString("CategoryName", "Test C1008G3");
            rs.insertRow();
            System.out.println("Inserted");
            conn.close(); //uncomment it's okay
        } catch (SQLException ex) {
            System.out.println("Error:" + ex.getMessage());
        }
    }
}

共 (4) 个答案

  1. # 1 楼答案

    您正在插入中关闭连接,因此第二次插入发生在关闭的连接上

    conn.close()的位置应该是这样的:

    public static void main(String[] args) throws Exception{
        try{
            initialize();
            insert();
            insert();
        }
        finally{
            conn.close();
        }
    }
    

    这样,在出现任何问题时,您可以保证连接正确关闭

  2. # 2 楼答案

    问题是,在关闭所述连接后,您正试图写入连接。 你可以取消那一行的注释,但那只是一种糟糕的做法。 我的建议是:调用initialize();方法不是从主方法内部,而是作为insert方法中的第一条语句

    这样,你就可以确保每次需要时都能连接到它

  3. # 3 楼答案

    在insert方法中有conn.close(); //uncomment it's okay

    但事实并非如此

    关闭此连接后,将不再打开它

  4. # 4 楼答案

    jdbc连接是一个有点沉重的对象,它背后的想法不是在每次操作后关闭它,而是在多个任务中重用连接。应用程序完成后,您应该关闭连接。如果你坚持自己的连接,你必须在每次关闭后重新初始化