NonWritableChannelException при попытке обновить базу данных Access

Впервые использую UCanAccess для проекта, и у меня много проблем со вставкой строки в одну из таблиц моей базы данных (в Microsoft Access).

Мой код имеет смысл, но после его выполнения я каждый раз получаю одну и ту же ошибку, даже несмотря на то, что NetBeans может подключиться к моей базе данных.

 
    package Vegan;

import java.sql.Connection;
import java.sql.DriverManager;


public class connectionString {

static Connection connection = null;

public static Connection getConnection()
{
    try
    {
        connection = DriverManager.getConnection("jdbc:ucanaccess://C://MyDatabase1.accdb");
        System.out.println("---connection succesful---");
    }

    catch (Exception ex)
    {
        System.out.println("Connection Unsuccesful");
    }

    return connection;
}  


    package Vegan;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


public class DB {


private static ResultSet rs = null;
private static PreparedStatement ps = null;
private static Connection connection = null;

public DB() {
    connection = connectionString.getConnection();
}


public void AddTest() {
    try {

        String sql = "INSERT INTO CategoryTbl(CategoryName) VALUES (?)";
        ps = connection.prepareStatement(sql);

        ps.setString(1, "Flours");
        ps.executeUpdate();
        System.out.println("Inserted");
    } catch (Exception ex) {
        System.out.println(ex.getLocalizedMessage().toString());
    }

}

После этого, когда я выполняю метод AddTest(), я получаю следующий системный вывод:


     run:
    ---connection succesful---
    java.nio.channels.NonWritableChannelException
    at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:724)
    at com.healthmarketscience.jackcess.impl.PageChannel.writePage(PageChannel.java:297)
    UCAExc:::3.0.6 null
    at com.healthmarketscience.jackcess.impl.PageChannel.writePage(PageChannel.java:234)
    at com.healthmarketscience.jackcess.impl.TableImpl.writeDataPage(TableImpl.java:1375)
    at com.healthmarketscience.jackcess.impl.TableImpl.addRows(TableImpl.java:1624)
    at com.healthmarketscience.jackcess.impl.TableImpl.addRow(TableImpl.java:1462)
    at net.ucanaccess.converters.UcanaccessTable.addRow(UcanaccessTable.java:44)
    at net.ucanaccess.commands.InsertCommand.insertRow(InsertCommand.java:101)
    at net.ucanaccess.commands.InsertCommand.persist(InsertCommand.java:148)
    at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:315)
    at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:205)
    at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:161)
    at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50)
    at net.ucanaccess.jdbc.UcanaccessPreparedStatement.executeUpdate(UcanaccessPreparedStatement.java:253)
    at Vegan.DB.AddTest(DB.java:91)
    at Vegan.TestDB.main(TestDB.java:17)
BUILD SUCCESSFUL (total time: 1 second)

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


person Jeremy Crouch    schedule 08.09.2016    source источник
comment
NonWritableChannelException? У учетной записи, под которой вы работаете, есть права на изменение файла .mdb? Он находится в верхней части вашего C:\, что является очень плохим местом для хранения данных.   -  person Marc B    schedule 09.09.2016
comment
Боже мой, я не могу поверить, что проглядел это. Теперь он отлично работает, потому что я сохранил его в отдельной папке. Большое спасибо!   -  person Jeremy Crouch    schedule 09.09.2016


Ответы (1)


"java.nio.channels.NonWritableChannelException" означает, что файл базы данных не может быть обновлен. В вашем случае это произошло потому, что файл базы данных находился в корневой папке системного диска Windows (C:\), а простые смертные имели ограниченные права доступа к этой папке.

Решение: переместите файл базы данных в папку, к которой у вас есть полный доступ для записи.

person Gord Thompson    schedule 09.09.2016