java通过Access_JDBC30读取access数据库时无法获取最新插入的记录以及使用ucanaccess连接Access数据库
前言:一般使用的编译环境是java SE 1.8,不支持odbc的连接方式,所以可以用jdbc的连接方式。
jdbc存在数据获取刷新问题,建议使用odbc连接。odbc连接注意环境版本号!
1、编写了一个循环程序,每几秒钟读取一次,数据库中最新一行数据
连接access数据库的方法和查询的信息。之后开一个定时去掉用。
package javacommon.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.ybb.DBConnection;
/**
*
* @author ybb
* 连接Access数据库
* java通过Access_JDBC30获取access数据库数据,取不到最新的数据
*/
public class AccessDBUtil {
private static final String DRIVER="com.hxtt.sql.access.AccessDriver";
private static final String URL="jdbc:Access:///G:/ceshi/ceshi.mdb";
private static final String USER="";
private static final String PASSWORD="";
public static Connection getConnection(){
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
return connection;
} catch (SQLException e) {
return null;
}
}
public static void colseConnection(Connection conn){
try {
if(conn!=null&&!conn.isClosed()){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void myclose(Connection con,PreparedStatement ps){
try {
if (con!=null&&!con.isClosed()) {
con.close();
}
if (ps!=null) {
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void myclose(Connection con,PreparedStatement ps,ResultSet rs){
try {
if (con!=null&&!con.isClosed()) {
con.close();
}
if (ps!=null) {
ps.close();
}
if (rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试
* */
public static void main(String[] args){
Connection connnect = null;
while(true){
try{
connnect = AccessDBUtil.getConnection();
if(connnect!=null){
System.out.println(connnect+"\n连接成功");
}else{
System.out.println("连接失败");
}
Statement stat = connnect.createStatement();
ResultSet rs = stat.executeQuery("select * from CYJ_PD_QTJL");
if(rs!=null){
while(rs.next()){
System.out.println(rs.getString(1)+"\t"+rs.getString(2));
}
}
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}finally{
colseConnection(connnect);//关闭链接
}
}
}
}
2、当手动向对应的access数据库中CYJ_PD_QTJL表
添加数据时,查询不到刚添加的数据。需要重启此程序才能查询到。
3、为了解决此问题更换驱动。用ODBC连接完美解决。
package com.ybb;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/**
*
* @author ybb
* 连接access数据
* 获取access数据库数据,可以取到最新的数据
* 2019年4月16日 下午2:48:33
*/
public class DBConnection {
/**
* 该方法用来连接数据库
* @param db:数据源名称
* */
public static Connection getDBConnection(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//注册驱动
//Access中的数据库默认编码为GBK,本地项目为UTF-8,若不转码会出现乱码
Properties p = new Properties();
p.put("charSet", "GBK");
Connection connect= DriverManager.getConnection("jdbc:odbc:ceshi",p);
return connect;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**
* 该方法用来执行SQL并返回结果集
* */
public static ResultSet selectQuery(String sql){
try{
PreparedStatement stmt = getDBConnection().prepareStatement(sql);
ResultSet rs = stmt.executeQuery();//执行SQL
return rs;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**
* 测试
* */
public static void main(String[] args){
while(true){
try{
Connection connnect = DBConnection.getDBConnection();
if(connnect!=null){
System.out.println(connnect+"\n连接成功");
}else{
System.out.println("连接失败");
}
ResultSet rs1 = selectQuery("select * from CYJ_PD_QTJL");
if(rs1!=null){
while(rs1.next()){
System.out.println(rs1.getString(1)+"\t"+rs1.getString(2));
}
}
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}finally{
// closeConn();//关闭链接
}
}
}
}
4、此时手动向CYJ_PD_QTJL表中添加数据。可以立刻查询到刚添加的数据。
5、方式二:使用ucanaccess连接Access数据库。
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; /** * * @author Administrator * */ public class Access { /** * Access数据库Connection */ private Connection connection; static { try { Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");//加载ucanaccess驱动 } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } public Connection getAccessConnection(String path, String user, String pwd) { try { //获取Access数据库连接(Connection) this.connection = DriverManager.getConnection("jdbc:ucanaccess://" + path, user, pwd); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } return this.connection; } public static void main(String[] args) throws Exception { Access access=new Access(); Connection connection = access.getAccessConnection("F:\\Access\\test.accdb", "", ""); // access.insert(connection); access.select(connection); } /** * Access插入(使用了预编译) */ public int insert(Connection connection) throws Exception { // ? 是 JDBC 预编译的占位符 PreparedStatement statement=connection.prepareStatement("insert into student(name,address,age) values(?,?,?)"); statement.setString(1, "Ybb"); statement.setString(2, "湖南省、长沙市、岳麓区"); statement.setInt(3, 20); int result = statement.executeUpdate(); statement.close(); connection.close(); System.err.println("添加数据成功"); return result; } /** * Access删除 */ public int delete(Connection connection) throws Exception { Statement statement = connection.createStatement(); int result = statement.executeUpdate("delete from student where id=3"); statement.close(); connection.close(); return result; } /** * * @param connection * @return * @throws Exception */ public int update(Connection connection) throws Exception { Statement statement = connection.createStatement(); int result = statement.executeUpdate("update student set address='湖南省、长沙市、雨花区' where id=1"); statement.close(); connection.close(); return result; } /** * Access查询 * * @param connection 连接 * @throws Exception 异常 * @date: 2022 */ public void select(Connection connection) throws Exception { Statement statement = connection.createStatement(); ResultSet result = statement.executeQuery("select * from student"); while (result.next()) { System.out.print(result.getString("id") + "\t"); System.out.print(result.getString("name") + "\t"); System.out.print(result.getString("address") + "\t"); System.out.print(result.getString("age") + "\t"); System.out.println(); } statement.close(); connection.close(); } }
6、ucanaccess连接Access数据库,源码下载链接
链接:https://pan.baidu.com/s/1iKTsFYxg4TNA1BRmctHWyw
提取码:w53g