2013-10-24 3 views
0

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) 

ответ

1

Это зависит от того, как "dBaseIII" ориентированная таблица на самом деле. Некоторые из предыдущих версий, возвращающихся назад, имеют различную информацию заголовка файла, и это может быть проблемой. В этом случае вам может потребоваться одноразовый процесс открытия и копирования таблицы версий VFP в формате dBaseIII, а затем переместить это в производственный путь для вашего соединения.

, если вы используете Microsoft Visual Provider Foxpro OleDb, вы можете подключиться к пути, где таблица является, и выполнить скрипт что-то вроде

USE YourTable 
COPY to NewVersion TYPE FOXPLUS 

невыгоде старых форматов файлов Dbase это не признают соответствующие индексные файлы без явного открытия и не будут оптимизировать запросы ... но опять же, что основано на очень старых форматах файлов dBASE.

Here's one showing a sample SQL Command for execution

+0

Я понял, что моя проблема была исправлена ​​по-другому, но это самый полезный ответ для меня и других, которые могут столкнуться с такими проблемами. Блестяще и спасибо! Отличное объяснение и весь пример. –

0

путь DRapp, чтобы преобразовать в FOXPLUS (Dbase III-совместимый) формат будет работать хорошо, если у вас есть видео доступны Foxpro. Если нет, то here's documentation on the DBF format.

Вы могли бы изменить первые байты файла, чтобы отразить формат DBASE III: 0x2F будет соответствовать простому Dbase III/FoxBASE DBF, без записки, или 0x8A, если есть памятка (а memo будет файл с тем же именем, что и .DBF, но с расширением .DBT).

Обязательно сохраните резервную копию DBF, если вы решите отредактировать ее с помощью шестнадцатеричного редактора.

+0

В моей версии не требуется VFP, а только VFP OleDBProvider, который также позволяет пользователю выполнять скрипт на образцовую ссылку предыдущей обработки OleDB. – DRapp

 Смежные вопросы

  • Нет связанных вопросов^_^