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

Posted

技术标签:

【中文标题】如何使用 UCanAccess 从 Java 将两个字符串插入我的 Access 数据库?【英文标题】:How to insert two strings into my Access database from Java using UCanAccess? 【发布时间】:2014-07-01 03:57:28 【问题描述】:

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

【问题讨论】:

【参考方案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();

【讨论】:

【参考方案2】:

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

你可以使用...

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

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

    您的数据库支持更新ResultSet 中的值和 您想要更新现有值。

要将值插入数据库,您应该使用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 线索

附带说明...

    您不应将密码存储在Strings 中,而应将它们保存在char 数组中,并且 您不应该在没有以某种方式加密的情况下将密码存储在数据库中

【讨论】:

setString 要求我为第一个参数传递一个 int 更新了 try 子句 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 ("+user+", "+pass+")")) stmt.setString(1, user); stmt.setString(2, 通过); stmt.executeUpdate();出现错误:net.ucanaccess.jdbc.UcanaccessSQLException:用户缺少权限或找不到对象:USER12 我似乎无法弄清楚 USER12 指的是什么 答案中演示的try-with-resources仅适用于Java 7+ user 和 pass 是我用来从用户到程序的变量 是的,但是PreparedStaments 将变量绑定到参数位置,这就是setString 调用的目的。花几分钟阅读How to use Prepared Statements。以为我已经链接了,对不起【参考方案3】:

@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。 所有其他 cmets 似乎都是正确的。

【讨论】:

以上是关于如何使用 UCanAccess 从 Java 将两个字符串插入我的 Access 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

不使用 UCanAccess 从 Java 8 连接到 Access 数据库

如何通过 UCanAccess 访问远程机器上的数据库文件?

java.lang.ClassNotFoundException:net.ucanaccess.jdbc.ucanaccessDriver

UCanAccess Java 执行错误

有没有办法在 UcanAccess 中强制从磁盘读取?

如何使用 ucanaccess 获取查询中的行数