Я разместил приведенный ниже код на форуме разработчиков Sun, так как думал, что это ошибка (настоящая ошибка была еще до того, как этот код был запущен). В одном из полученных ответов говорилось, что это не сработает и выбросить. Но это действительно работает. Возможно, это не лучший код (я новичок в Java), но есть ли в нем что-то «неправильное»?
=============
КОД:
private static void ImportFromCsvToAccessTable(String mdbFilePath, String accessTableName
, String csvDirPath , String csvFileName ) throws ClassNotFoundException, SQLException {
Connection msConn = getDestinationConnection(mdbFilePath);
try{
String strSQL = "SELECT * INTO " + accessTableName + " FROM [Text;HDR=YES;DATABASE = " + csvDirPath + ";].[" + csvFileName + "]";
PreparedStatement selectPrepSt = msConn.prepareStatement(strSQL );
boolean result = selectPrepSt.execute();
System.out.println( "result = " + result );
} catch(Exception e) {
System.out.println(e);
} finally {
msConn.close();
}
}




Буквальный ответ - нет - в коде никогда не бывает ничего «изначально неправильного», все зависит от того, соответствует ли он требованиям, которые могут включать или не включать в себя ремонтопригодность, безопасность, надежность или скорость.
Код, который вы выполняете, на самом деле является запросом JET исключительно в Access - код Java не делает ничего, кроме указания Access выполнить запрос.
С одной стороны, если он не сломан, не чините его. С другой стороны, есть большая вероятность, что она сломается в ближайшем будущем, поэтому вы можете попробовать исправить ее заранее.
Две вероятные причины, по которым он может сломаться:
Сказав все это, мы все здесь о прагматизме. Если приведенный выше код взят из служебного класса, который вы собираетесь использовать вручную несколько раз в неделю / месяц / год / когда-либо, то это не проблема.
Если это класс, который является частью веб-приложения, то «официальный» способ Java сделать это будет считывать записи из файла CSV (либо с помощью парсера CSV, либо драйвера CSV / текстового JDBC), получить столбцы из набора записей, выполните для них некоторую проверку или работоспособность, а затем используйте новый PreparedStatement, чтобы вставить их в базу данных Access. Гораздо больше проблем, но гораздо надежнее.
Вероятно, вы можете найти комбинацию инструментов (например, объектно-реляционные слои или другие инструменты доступа к данным), которые сделают многое из этого за вас, но настройка инструментов будет такой же сложной задачей, как и написание кода. С другой стороны, вы многому научитесь у любого из них.
Одно предупреждение - jdbc -> Запросы доступа (которые соединяются с использованием odbc) не работают в 64-битных системах, так как не существует 64-битных драйверов базы данных Access (драйвер включен в 32-битные копии Windows и доступен только для 32-битные процессы. Вы можете запустить odbcad32 или посмотреть на панель управления ODBC, чтобы убедиться, что драйвер присутствует)
Хотя я не вижу кода со строкой подключения в вашем фрагменте кода, мне неизвестны какие-либо некоммерческие драйверы JDBC Access для Java, только мост jdbc-> odbc и использование драйвера Access (* .mdb) в Windows . Microsoft больше не поддерживает этот драйвер и не планирует переносить его на 64-разрядную версию, поэтому с точки зрения инфраструктуры стоит подумать.
Вопрос Джошуа Маккиннону:
Не могли бы вы процитировать планы MS никогда не вводить 64-битные драйверы ODBC для Jet? Это звучит разумно, поэтому я совсем не сомневаюсь в вас, я просто хотел бы знать, есть ли у вас источник, на который вы можете указать.
Конечно, MS является предоставляет доступ к Jet на 64-битных системах через OLEDB, правда? Это не помогает с JDBC, но, безусловно, предоставляет метод использования данных Jet (они должны что-то предоставлять, поскольку Jet 4 является частью ОС, поскольку он используется в качестве хранилища данных для Active Directory и поэтому использовался начиная с Windows 2000).
@ david.w.fenton.myopenid.com: «Не могли бы вы процитировать планы MS никогда не вводить 64-битные драйверы ODBC для Jet?»
Дэвид, я нашел сообщение об этом в Microsoft Connect Feedback.
http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=125117
«В настоящее время нет планов по выпуску 64-разрядной версии драйвера JET командой Office. Мы можем рассмотреть альтернативные варианты и сообщим вам, когда у нас будет конкретный план».
Спасибо, Команда SSIS. Отправленный Microsoft 03.10.2007 в 21:47
В этой обратной связи не было обновлений от Microsoft.
В Access 2010 установлены 64-разрядные драйверы.