EDIT: Я узнал, что эта ошибка была выбрана из-за того, что новый файл данных находится в форме Visual Foxpor dbf, а мой главный файл - dBaseIII. Любые предложения о том, как программно изменить VFP на dBaseIII?Преобразование Visual Foxpro dbf в dBaseIII
Я открываю два файла .dbf. Один - это главный файл, а один - файл с новыми данными. Я хочу вставить новые данные в главный файл.
я подключаю к каталогу, который содержит файлы, например, так:
Connection connection = null;
String dbString = "jdbc:odbc:Driver={Microsoft dBASE Driver (*.dbf)};DBQ=" + dealerSNS + "\\";
try
{
System.out.println("Opening Database Directory " + dealerSNS);
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connection = DriverManager.getConnection(dbString, "", "");
System.out.println("Connection established!");
}
catch (ClassNotFoundException cnfEx)
{
System.out.println("* Unable to load driver! *");
System.exit(1);
}
catch (SQLException sqlEx)
{
System.out.println(dbString);
System.out.println("* Cannot connect to database! * SQL = " + sqlEx);
System.exit(1);
}
Тогда я называю подготовленное заявление:
try
{
String update = "INSERT INTO fullSNS SELECT * FROM newSNS";
PreparedStatement ps = connection.prepareStatement(update);
ps.executeUpdate();
System.out.println("query: " + ps+ " worked!");
}
catch (SQLException se)
{
se.printStackTrace();
}
Оба .dbf имеют те же поля и находятся в тот же каталог, поэтому я не уверен, что я делаю неправильно, что он не свяжет их.
Любые предложения/идеи?
Мой StackTrace выглядит следующим образом:
java.sql.SQLException: [Microsoft][ODBC dBase Driver] External table is not in the expected format.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6964)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7121)
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3156)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:215)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPreparedStatement.java:137)
at ads.SmooshNMoveFiles.checkNSmoosh(SmooshNMoveFiles.java:116)
at ads.ActiveTimer.reportToWork(ActiveTimer.java:82)
at ads.ActiveTimer.run(ActiveTimer.java:28)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Я понял, что моя проблема была исправлена по-другому, но это самый полезный ответ для меня и других, которые могут столкнуться с такими проблемами. Блестяще и спасибо! Отличное объяснение и весь пример. –