Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA-插入数据库问题_Java_Database_Odbc - Fatal编程技术网

JAVA-插入数据库问题

JAVA-插入数据库问题,java,database,odbc,Java,Database,Odbc,我在将数据插入数据库时遇到问题。它返回一行被插入,但当我实际检查数据库时,实际上没有插入任何新的内容 以下是我的更新功能: public int update(String sqlStatement) { int rows = 0; try { Statement st = this.conn.createStatement(); rows = st.executeUpdate(sqlStatement); this.conn.co

我在将数据插入数据库时遇到问题。它返回一行被插入,但当我实际检查数据库时,实际上没有插入任何新的内容

以下是我的更新功能:

public int update(String sqlStatement) {
    int rows = 0;
    try {
        Statement st = this.conn.createStatement();
        rows = st.executeUpdate(sqlStatement);
        this.conn.commit();
        st.close();
            } catch (Exception err) {
        System.out.println("Got err doing update: " + err.getMessage());
    }   
    return rows;
}
下面是通过其对象调用它的函数:

            db = new Database();
            int rows = 0;
            String sql = "INSERT INTO tblStudent (firstName, lastName, username, password, isAdmin) ";
         sql += String.format("VALUES ('%s', '%s', '%s', '%s', %d)", fName, lName, username, passwd, isAdmin);
            System.out.println("Trying " + sql);
            if((rows = db.update(sql)) == 0) {
                System.out.println("Could not create new user");
                throw new Exception();
            }
            System.out.println("Rows " + rows);
正如我所说的,它报告在DB中插入了一行,但实际上什么都没有。该数据库是MS访问数据库

谢谢你的帮助


好的,解决了这个问题

看来你必须关闭连接。即使没有被重用

我向数据库类添加了以下函数:

    public void close() {
    try {
        this.conn.close();
    } catch (Exception err) {
        System.out.println("Error while closing connection: " + err.getMessage());
    }
}
然后在finally子句中添加了与其他函数相近的函数:

        try {
            db = new Database();
            int rows = 0;
            String sql = "INSERT INTO tblStudent (firstName, lastName, username, password, isAdmin) ";
            sql += String.format("VALUES ('%s', '%s', '%s', '%s', %d)", fName, lName, username, passwd, isAdmin);
            System.out.println("Trying " + sql);
            if((rows = db.update(sql)) == 0) {
                System.out.println("Could not create new user");
                throw new Exception();
            }
            System.out.println("Rows " + rows);
        } catch (Exception err) {
            System.out.println("Got err in registerUser: " + err.getMessage());
            return false;
        } finally {
            db.close();
        }

我想知道为什么会有提交选项,因为即使您告诉它提交,它实际上也不会执行提交。

首先,使用prepare语句而不是手动连接。当您在该应用程序之外检查数据库时,应用程序连接是否已关闭?当使用此连接从应用程序执行SELECT查询时,数据是否存在?在执行插入之前,我执行SELECT,检查数据库中是否存在某些用户。此选择工作正常,正确地从同一个表中获取数据。RE:使用prepare语句。我知道还有其他方法可以做到这一点,但我想尝试并理解为什么这种方法不起作用。请注意,此代码容易受到SQL注入的攻击。使用包含单引号的FistName执行一个简单测试。您需要确保正在使用的db.update方法中运行的任何代码也正在关闭它正在使用的任何数据库资源。