Код Java для импорта CSV в Access

Я разместил приведенный ниже код на форуме разработчиков 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();
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
4 002
4

Ответы 4

Буквальный ответ - нет - в коде никогда не бывает ничего «изначально неправильного», все зависит от того, соответствует ли он требованиям, которые могут включать или не включать в себя ремонтопригодность, безопасность, надежность или скорость.

Код, который вы выполняете, на самом деле является запросом JET исключительно в Access - код Java не делает ничего, кроме указания Access выполнить запрос.

С одной стороны, если он не сломан, не чините его. С другой стороны, есть большая вероятность, что она сломается в ближайшем будущем, поэтому вы можете попробовать исправить ее заранее.

Две вероятные причины, по которым он может сломаться:

  1. Риск внедрения SQL. В зависимости от того, откуда берутся csvDirPath и csvFileName (например, csvFileName может происходить от имени файла, загруженного пользователем?), И от того, насколько умен JDBC-драйвер Access, вы можете быть открыты для тех, кто сломает или удалит ваши данные, вставив точка с запятой (или несколько скобок для создания подзапроса) и некоторые дополнительные команды SQL в запросе.
  2. Вы полагаетесь на совместимость столбцов CSV-файла со столбцами таблицы Access. Если вы не отметили загружаемый CSV-файл, или если у CSV-генератора есть особый способ обработки нулей, или если вы однажды получите необычный формат даты или числа, вы можете получить ошибку при вставке в таблицу 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-разрядную версию, поэтому с точки зрения инфраструктуры стоит подумать.

В Access 2010 установлены 64-разрядные драйверы.

Fionnuala 19.01.2012 20:21

Вопрос Джошуа Маккиннону:

Не могли бы вы процитировать планы 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.

Другие вопросы по теме