如何使用UCanAccess从Java向Access数据库插入两个字符串?

时间:2014-07-01 03:57:28

标签: java sql jdbc ucanaccess

我正在尝试使用Java在我的数据库的两个单独列列上添加两个字符串,但我不确定我做错了什么。我正在使用的代码

 try{
    Connection conn = DriverManager.getConnection(
                "jdbc:ucanaccess://C:/Users/nevik/Desktop/databaseJava/Employee.accdb");
        Statement st = conn.createStatement();
        String sql = "Select * from Table2";
        ResultSet rs = st.executeQuery(sql);


        rs.updateString("user", user);
        rs.updateString("pass", pass);

        rs.updateRow();

    }
    catch(SQLException ex){
        System.err.println("Error: "+ ex);
    }

我的数据库中的第一列是user,下一列是pass。我正在使用UCanAccess来访问我的数据库。

3 个答案:

答案 0 :(得分:1)

这是您通常在java中更新行的方式:

String query = "update Table2 set user = ?, pass= ?";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt   (1, user);
preparedStmt.setString(2, pass);

// execute the java preparedstatement
preparedStmt.executeUpdate();

答案 1 :(得分:1)

首先,您还没有更新ResultSet中当前光标的位置,这意味着它没有指向任何内容......

你可以使用......

if (rs.next()) {
   rs.updateString("user", user);
   rs.updateString("pass", pass);
   rs.updateRow();
}

但这假定了两件事......

  1. 您的数据库支持更新ResultSet
  2. 中的值
  3. 您想要更新现有值。
  4. 要在数据库中插入值,您应该使用INSERT命令,例如......

    try(Connection conn = DriverManager.getConnection(
                "jdbc:ucanaccess://C:/Users/nevik/Desktop/databaseJava/Employee.accdb")) {
        try (PreparedStatement stmt = conn.prepareStatement("INSERT into Table2 (user, pass) VALUES (?, ?)") {
            stmt.setString(1, user);
            stmt.setString(2, pass);
            int rowsUpdated = stmt.executeUpdate();
        }
    }
    catch(SQLException ex){
        System.err.println("Error: "+ ex);
    }
    

    您可能需要花一些时间来阅读基本SQL教程和JDBC(TM) Database Access路径

    作为旁注......

    1. 你不应该在String中存储密码,你应该将它们保存在char阵列中
    2. 您不应该在没有以某种方式加密的情况下将密码存储在数据库中

答案 2 :(得分:1)

@ guevarak12 关于原始问题(如何使用可更新的ResultSet): 你的代码错了,你必须将光标移动到正确的位置。 特别是,如果要插入新行,则必须调用rs.moveToInsertRow();在rs.updateString之前("用户",用户)。 如果要更新现有行,则必须移动光标调用rs.next(),然后到达要更新的行。 您还必须以不同的方式创建Statement:

Statement st = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);

请参阅UCanAccess源代码分发中的junit示例,类net.ucanaccess.test.CrudTest。 所有其他评论似乎都是正确的。