使用java将数据从csv文件导入访问数据库
Posted
技术标签:
【中文标题】使用java将数据从csv文件导入访问数据库【英文标题】:importing data from csv file into access database using java 【发布时间】:2014-10-30 09:16:54 【问题描述】:我需要使用 java 将 csv 导入到 access 数据库中。我尝试使用以下代码
我的代码:
public static void main (String args[])
String dbFileSpec = "C:\\Documents and Settings\\admin\\My Documents\\NetBeansProjects\\AutomateExcelDatabase\\Centre.accdb";
// String accessTableName = "Centre";
String csvDirPath = "C:\\Documents and Settings\\admin\\My Documents\\NetBeansProjects\\AutomateExcelDatabase";
String csvFileName = "myjdbcfile.csv";
try (Connection conn = DriverManager.getConnection(
"jdbc:ucanaccess://" + dbFileSpec
// + ";newdatabaseversion=V2007"
))
try
String strSQL = "SELECT * INTO " + dbFileSpec + " FROM [Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]";
System.err.println("SQL --> "+strSQL);
PreparedStatement selectPrepSt = conn.prepareStatement(strSQL);
boolean result = selectPrepSt.execute();
System.out.println("result = " + result);
catch(SQLException ex)
System.err.println("Error --->"+ex.toString());
conn.commit();
conn.close();
catch (SQLException ex)
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
但它会抛出错误为“net.ucanaccess.jdbc.UcanaccessSQLException:意外令牌:INTO required:FROM”。
【问题讨论】:
【参考方案1】:尝试使用的两个问题
SELECT ... INTO NewTableName FROM [Text; ...].[csvFileName]
在这种情况下是:
SELECT ... INTO NewTableName FROM OldTableName
是 UCanAccess 不支持的 Access SQL 构造(至少目前不支持),并且
... FROM [Text; ...].[csvFileName]
是一个 ODBC“技巧”,UCanAccess 不使用 ODBC。
但是,UCanAccess 使用 HSQLDB,而 HSQLDB 支持读取 CSV 文件,如下所示:
final String csvFolder = "C:/__tmp/zzzTest/";
final String csvFileName = "myjdbcfile.csv";
final String csvDbName = "hsqldbTemp";
try (Connection hconn = DriverManager.getConnection(
"jdbc:hsqldb:file:" + csvFolder + "/" + csvDbName,
"SA",
""))
try (Statement s = hconn.createStatement())
s.executeUpdate("CREATE TEXT TABLE fromcsv (id int, textcol varchar(50))");
s.executeUpdate("SET TABLE fromcsv SOURCE \"" + csvFileName + "\" DESC");
try (ResultSet rs = s.executeQuery("SELECT * FROM fromcsv"))
while (rs.next())
System.out.println(rs.getString("textcol"));
s.executeUpdate("SHUTDOWN");
File f = null;
f = new File(csvFolder + "/" + csvDbName + ".properties");
f.delete();
f = new File(csvFolder + "/" + csvDbName + ".script");
f.delete();
catch (Exception e)
e.printStackTrace(System.out);
所以你可以使用两个连接,
一个jdbc:ucanaccess
连接到 Access 数据库,以及
另一个jdbc:hsqldb
连接到 CSV 文件,
然后将 CSV 文件中的行插入 Access 数据库中的表中。
【讨论】:
【参考方案2】:您在这里输入了错误的查询,
String strSQL = "SELECT * INTO " + dbFileSpec + " FROM
[Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]";
应该是,
String strSQL = "SELECT *" + dbFileSpec + " FROM [Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]";
【讨论】:
使用它会产生错误“net.ucanaccess.jdbc.UcanaccessSQLException: unexpected token: :” 我很担心。为什么你把简单的select
语句写得这么复杂
我认为应该是:“SELECT * FROM ...”。中间没有 dbFileSpec。以上是关于使用java将数据从csv文件导入访问数据库的主要内容,如果未能解决你的问题,请参考以下文章