如何使用 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 线索
附带说明...
-
您不应将密码存储在
String
s 中,而应将它们保存在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