импорт данных из файла csv в базу данных доступа с использованием java

Мне нужно импортировать csv в базу данных доступа, используя java. Я попытался использовать следующий код

мой код:

  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 требуется: FROM».


person Dhinakar    schedule 30.10.2014    source источник


Ответы (2)


Две проблемы с попыткой использовать

SELECT ... INTO NewTableName FROM [Text; ...].[csvFileName]

в этом контексте являются:

  1. SELECT ... INTO NewTableName FROM OldTableName — это конструкция Access SQL, которую UCanAccess не поддерживает (по крайней мере, на данный момент), и

  2. ... 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.

person Gord Thompson    schedule 01.11.2014

Вы неправильно набрали запрос здесь,

  String strSQL = "SELECT * INTO " + dbFileSpec + " FROM
 [Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]";

должно быть ,

 String strSQL = "SELECT *" + dbFileSpec + " FROM [Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]";
person Santhosh    schedule 30.10.2014
comment
при его использовании возникает ошибка net.ucanaccess.jdbc.UcanaccessSQLException: неожиданный токен: : - person Dhinakar; 30.10.2014
comment
Я волнуюсь . почему вы так усложняете свое простое select утверждение - person Santhosh; 30.10.2014
comment
Я думаю, что это должно быть: SELECT * FROM .... без dbFileSpec посередине. - person Olivier Masseau; 30.10.2014