SQL INSERT INTO таблицы MS Access. Данные отсутствуют без повторного открытия файла базы данных

резюме (после выполнения инструкции SQL INSERT INTO данные недоступны для просмотра в таблице MS Access без закрытия и повторного открытия базы данных)

Что это такое: Простой класс Java, использующий Ucanaccess diver для вставки строк в существующую таблицу в файле базы данных MS Access.

Чтобы создать условие: Откройте файл базы данных MS Access. Создайте и сохраните таблицу с четырьмя столбцами. Назовите таблицу «TestExportRows». В дополнение к приведенному ниже коду вам потребуется добавить в приложение Java пользовательский графический интерфейс с кнопкой, которая запускает метод. Запустите java-приложение, нажмите кнопку, которая запускает оператор SQL в «методе public void testExportSingleRow()». Откройте таблицу в базе данных MS Access. Записей не видно. Закройте и снова откройте базу данных MS Access и откройте таблицу. Теперь записи видны. Кроме того, невозможно сжать и восстановить базу данных, пока приложение Java не будет закрыто.

Я долго и упорно искал ответ на этот вопрос. Я также потратил много времени на устранение возможных причин. Я считаю, что правильно закрываю соединение и заявление. Мне нужно, чтобы эта работа работала без необходимости повторного открытия базы данных MS Access или закрытия приложения Java.

Вот код:

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author petehahn
 */
public class Trash {

public void testExportSingleRow() {
 try {

        File dir1 = new File("..");
        String path1;
        path1 = dir1.getCanonicalPath();
        String pathTarget = path1 + "\\" + "Playground.accdb";
        File dbTargetFile = new File(pathTarget);
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        String url = "jdbc:ucanaccess://" +dbTargetFile +";showschema=true";
        Connection dbConnection = DriverManager.getConnection(url);

        String sqlString = "INSERT INTO TestExportRows(Item,Category,Aluminum,Copper) "
                        +"VALUES ('Column 1','Column 2','Column 3','Column 4')";
        Statement sqlInsertStatement = dbConnection.createStatement();
        sqlInsertStatement.executeUpdate(sqlString);

        dbConnection.commit();
        dbTargetFile = null;
        sqlInsertStatement.close();
        dbConnection.close();

    } catch (IOException | ClassNotFoundException | SQLException ex) {
        Logger.getLogger(DbTestExportToAccess.class.getName()).log(Level.SEVERE, null, ex);
    }       
}

}

NetBeans 8.0.2 64-разрядная версия MS Access 2013 32-разрядная Windows 8.1 64-разрядная версия ucanaccess 2.0.9.3


person Pete Hahn    schedule 19.03.2015    source источник
comment
Такое поведение Access в некоторой степени имеет смысл, поскольку вы используете клиент для подключения к базе данных, но, будучи одним и тем же пользователем, вы инициируете два параллельных экземпляра пользователя. У меня были те же проблемы с подключением R к Access, даже Python с MySQL. Проще говоря, клиент должен завершить свой сеанс или эффективно закрыть свое соединение перед открытием серверной части. Если вы обновите ленту, появятся ли записи? Если вы закроете приложение Java, а затем откроете базу данных, появятся ли записи? Такое же поведение происходит с внешним пользователем?   -  person Parfait    schedule 19.03.2015
comment
Нажатие кнопки «Обновить» на ленте не влияет. Закрытие БД и ее повторное открытие — единственное, что делает записи видимыми. Java-приложение все еще может быть открыто и запущено. Я не пробовал подключаться как внешний пользователь. Не уверен, как бы я это сделал, я посмотрю на это. Спасибо.   -  person Pete Hahn    schedule 19.03.2015


Ответы (1)


Пит, это абсолютно известный результат, потому что ты пишешь в файл доступа, не проходя через движок Microsoft Jet. Таким образом, Access не может знать, что вы обновляете файл, пока он не будет открыт повторно. Я не могу понять, в чем ваша настоящая проблема или беспокойство.

Ucanaccess может помочь вам манипулировать файлами доступа (во всех ОС), но не может интегрироваться с клиентом Access.

Обратите внимание, что практика с неконтролируемым одновременным доступом к файлу Access из разных процессов (java через UCanAccess и клиент Access) КАТЕГОРИЧЕСКИ НЕЖЕЛАТЕЛЬНА.

person jamadei    schedule 19.03.2015
comment
Вау, видимо, я очень далек от желаемого решения. У меня есть клиент с существующим приложением Java, которое подключается к серверу MS SQL. Это Java-приложение выполняет очень сложный фильтр этих данных и отображает результаты в jTable. Я просто пытаюсь получить эти результаты в базе данных Access, где я создаю пользовательский интерфейс для работы с этими результатами. - person Pete Hahn; 19.03.2015
comment
Если вы говорите о встроенном графическом интерфейсе Access, вы можете столкнуться с некоторыми проблемами. Если это отдельное приложение, проблем быть не должно. - person jamadei; 19.03.2015
comment
Пит, вместо java в качестве носителя передавайте данные непосредственно из SQL Server в Access (т. е. сквозной запрос, связанная таблица), если только фильтр не может быть выражен в SQL-запросе. В качестве альтернативы попробуйте экспортировать jtable в csv, xlsx, txt или xml, которые можно импортировать в Access (даже автоматически с помощью VBA) без блокировки таблицы. - person Parfait; 20.03.2015