1

我正在尝试使用 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 来访问我的数据库。

4

3 回答 3

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();
于 2014-07-01T04:11:26.807 回答
1

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

你可以用...

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

但这假设有两件事......

  1. 您有一个支持更新和中的值的ResultSet数据库
  2. 您想要更新现有值。

要将值插入数据库,您应该使用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) 数据库访问路径

作为旁注...

  1. 您不应该将密码存储在Strings 中,您应该将它们保存在char数组中并
  2. 您不应该在没有以某种方式加密的情况下将密码存储在数据库中
于 2014-07-01T04:11:41.010 回答
1

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

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

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

于 2014-07-04T08:32:32.833 回答