【问题标题】:NonWritableChannelException when trying to update an Access database尝试更新 Access 数据库时出现 NonWritableChannelException
【发布时间】:2017-01-16 22:36:53
【问题描述】:

第一次在项目中使用 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)

当我再次检查 Access 时,没有对数据库进行任何更改。 可能是什么原因造成的,错误消息是什么意思?谢谢

【问题讨论】:

  • NonWritableChannelException?您运行它的帐户是否有权修改 .mdb 文件?你把它放在 C:\ 的顶部,这是一个非常糟糕的存储数据的地方。
  • 天哪,我不敢相信我忽略了这一点。现在我已经将它存储在一个单独的文件夹中,它工作得很好。非常感谢!

标签: java sql ms-access ucanaccess jackcess


【解决方案1】:

“java.nio.channels.NonWritableChannelException”表示无法更新数据库文件。在您的情况下,这是因为数据库文件位于 Windows 系统驱动器 (C:\) 的根文件夹中,而普通人对该文件夹的权限有限。

解决方案:将数据库文件移动到您具有完全写入权限的文件夹中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多