big___orange 2020-07-13 11:57 采纳率: 0%
浏览 160
已结题

java利用jackcess-3.0.1和AccessJDBC30无法连续向一个access数据库创建两个(或多个)表格并插入数据的问题

本人JAVA小白

最近用java编程,利用jackcess-3.0.1和AccessJDBC30,将xml文件的数据(dom4j解析)向access数据库插入表格并插入数据,单独插入一个表格和数据是没问题的,如果插入一个表格并插入数据后,马上插入第二个表格和数据,会报错,显示找不到第二个表格,而打开数据库可以发现,第二个表格是插入成功的,包括表格的列标题也都显示了,但是没有数据。

我以为插入了第二个表格没来得及识别出来,于是在创建表格和插入数据之间加了延时,就是这样的过程:插入表格-->延时-->插入数据-->插入表格-->延时-->插入数据,但延时在10.05秒以下的时候依然会报错,可是从运行程序开始到插入表格和数据结束,不到2秒,于是我又把延时放在了创建两个表格之间,就是这样的过程:插入表格-->插入数据-->延时-->插入表格-->插入数据,这次是延迟在9.55秒以下会报错,大于9.95秒就能实现。(这个9.95秒和10.05秒有时候会变,但变化不超过0.05秒,也就是在9.90~10和10~10.10之间)

我有尝试过,单独运行连续插入两个表格不插入数据,不会报错,会创建成功;还有事先创建好表格后,单独运行连续插入数据到这两个表格,也会成功,不会报错,也就是说,只有在运行插入表格再插入数据的时候,必须间隔大约10秒以上,不然就只能创建第二个表格而无法插入数据。如何不用延时就能实现?或者延时短一些,一两秒也行,该怎么办呢?

下边是代码,我在程序中备注了我个人认为问题可能出现的程序范围。请问如何解决?谢谢。

import java.awt.Robot;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.healthmarketscience.jackcess.ColumnBuilder;
import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;
import com.healthmarketscience.jackcess.TableBuilder;

public class licunxuexi8_1 {

    static Connection con = null;  
    static Statement s = null;  
    static ResultSet rs = null;     
    static String xmlpath = "C:\\Users\\Administrator\\Desktop\\李村项目xml\\"; //xml文件的地址  
    static String xmlname = "井口文件 1xx000002MKJK20100603152330";
    static String xmlname2 = "井口文件 1xx000002MKJK20100603152335";
    static String mdbpath = "C:\\Users\\Administrator\\Desktop\\李村项目数据库\\";   //mdb文件的地址
    static String mdbname = "李村项目.mdb";

    /**
     * 插入表格至access数据库
     * @param string: 表格名称
     * @param attributes:表头(列标题,字段)
     * @param file:access数据库
     * @throws Exception
     */
    public static void create1(String string, Attribute[] attributes,Database file) throws Exception {      
        TableBuilder newTable;
        try {   
            newTable = new TableBuilder(string);
                    for (int i = 0; i < attributes.length; i++) {
                        newTable.addColumn(new ColumnBuilder(attributes[i].getName())
                                .setSQLType(Types.VARCHAR));
                    }
            newTable.toTable(file);         
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接数据源
     * @return
     */
    public static Connection getConnection(){  
        try {  
            Class.forName("com.hxtt.sql.access.AccessDriver");  
            con=DriverManager.getConnection("jdbc:Access:///"+mdbpath+mdbname);
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return con;  
    } 

    /**
     * 关闭数据源  
     * @param con
     * @param rs
     * @param s
     */
    public static void CloseConnection(Connection con,ResultSet rs,Statement s){  
        try {  
            if (rs!=null) {  
                rs.close();  
            }  
            if (s!=null) {  
                s.close();  
            }  
            if (con!=null) {  
                con.close();      
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    } 

    /**
     * 插入数据至access表格
     * @param string:表格名称
     * @param attributes:列标题
     */
    public static void add1(String string, Attribute[] attributes){         
        try {           
            con=getConnection();  
            s = con.createStatement();// 创建SQL语句对象              
            String allname = "";
            String alltext = "";
            String allstring;
            for (int i = 0; i < attributes.length; i++) {    
                if (i<attributes.length-1) {
                    allname+=attributes[i].getName()+",";
                    alltext+="'"+attributes[i].getText()+"',";    
                }
                else if(i==attributes.length-1) {
                    allname+=attributes[i].getName();
                    alltext+="'"+attributes[i].getText()+"'";    
                }                                   
            }
            allstring = "insert into "+"["+string+"]"+"("+allname+") values("+alltext+")"; 
            s.executeUpdate(allstring);   
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            CloseConnection(con, rs, s);    
        }  
    } 

    /**
     * 创建access、插入表格和插入数据
     * 用一个二维数组Attribute[][] attributes来存储数据,用来插入至access表格,xml中数据全部以属性的形式保存,所以数组是Attribute型的
     * @param xmln:xml文件名
     * @throws Exception
     */
    @SuppressWarnings("unused")
    public static void accesscreate(String xmln) throws Exception  {    
        File file1 = new File(xmlpath+xmln+".xml");
        if(file1.exists()) {                    
            int hangshu = 0;    //第一行为列属性
            int lieshu = 3;     //固定的三列                           
            //创建SAXReader对象,用于读取xml文件
            SAXReader reader = new SAXReader();
            //读取xml文件,得到Document对象
            Document doc = reader.read(new File(xmlpath+xmln+".xml"));
            //获取根元素
            Element root = doc.getRootElement();
            //确定root的子元素
            List<?> nodes = root.elements("head"); 
            List<?> nodes2 = root.elements("data");         
            //确定行数和列数
            for (Iterator<?> it11 = nodes2.iterator(); it11.hasNext();) { 
                Element data1 = (Element) it11.next();
                hangshu++;
            }        
            Iterator<?> it12 = nodes2.iterator(); 
            Element data2 = (Element) it12.next();
            for(Iterator<?> it13=data2.attributeIterator();it13.hasNext();) {
                Attribute a21 = (Attribute) it13.next();
                lieshu++;
            }           
            //建立数组
            Attribute[][] attributes = new Attribute[hangshu][lieshu];          

            //获取root下所有的head元素的所有属性
            for (Iterator<?> it2 = nodes.iterator(); it2.hasNext();) {          
                Element head = (Element) it2.next();
                int i,j;
                j = 0;
                for(Iterator<?> it3=head.attributeIterator();it3.hasNext();){           
                    Attribute a1 = (Attribute) it3.next(); 
                    j++;
                    i = 0;
                    for (Iterator<?> it14 = nodes2.iterator(); it14.hasNext();) { 
                        Element data1 = (Element) it14.next();

                        //获取root的所有属性
                        Iterator<?> it1=root.attributeIterator();       
                        Attribute code = (Attribute) it1.next();                    

                        attributes[i][0] = code;  
                        attributes[i][j] = a1;    
                        i++;                    
                    }
                }
            }           
            //获取root下所有的data元素的所有属性 
            int u,v; 
            u = 0;
            for (Iterator<?> it4 = nodes2.iterator(); it4.hasNext();) {   
                Element data = (Element) it4.next();         
                v = 2;
                for(Iterator<?> it5=data.attributeIterator();it5.hasNext();){           
                    Attribute a2 = (Attribute) it5.next();
                    v++; 
                    attributes[u][v] = a2; 
                }
                u++;
            }   

            /**
             * 问题应该是从这开始
             */

            //创建access数据库并插入表格          
            File file2 = new File(mdbpath+mdbname); 
            //如果不存在数据库就先创建再插入表格
            if(!file2.exists()) {               
                Database mdb = DatabaseBuilder.create(Database.FileFormat.V2003, new File(mdbpath+mdbname));
                create1(xmln,attributes[0],mdb);                
            }
            //如果存在数据库就直接插入表格
            else {
                Database mdb = DatabaseBuilder.open(file2);
                create1(xmln,attributes[0],mdb); 
            }   

//          Robot r = new Robot(); 
//          r.delay(10055);         //这个和后边主函数里的延时用其中一个就行

            //插入数据
            int i = 0;
            for (Iterator<?> it15 = nodes2.iterator(); it15.hasNext();) {       
                Element data1 = (Element) it15.next();          
                add1(xmln,attributes[i]);
                i++;
            }

            /**
             * 问题到这应该就结束了,add1和create1这两个只用其中一个是不会有任何错的,一起用就出事了
             */
        }
    }   

    public static void main(String[] args) throws Exception  {          
        accesscreate(xmlname);  

        /**
         * 如何不用下边这个延时也能实现?或者延时短一些,一两秒也行,这10秒太长了
         */
        Robot r = new Robot(); 
        r.delay(9955); 

        accesscreate(xmlname2);
    }
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-07-13 17:06
    关注

    手工将connection、database等关闭释放下

    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序