本人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);
}
}