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

posted @ 2019-04-17 16:29  舞到天亮  阅读(1933)  评论(0编辑  收藏  举报