导致错误的原因 'User lacks privilege or object not found: FieldName'

What is causing the error 'User lacks privilege or object not found: FieldName'

使用 MS Access 数据库保存我的信息,它一直运行良好,直到此时我创建了一个名为 CreateLicense() 的新方法,它接收许可证 class 我制作并写入数据库。

当代码为 运行 时,它会吐出一个错误 'user lacks privilege or object not found: EXPIRED'

已经尝试更改 Expired 的字段名称,以防它是保留字或其他内容。还尝试删除过期字段,但随后标记相同的错误,但改为使用 CONTACT


INSERT INTO Licenses (Name, DateRedeemed, Expired, LicenseLength, Contact) VALUES ('name','25/Jun/2019','02/Jul/2019','2','contact')
user lacks privilege or object not found: EXPIRED

这是我的 SQL 语句的输出 这是代码

public boolean CreateLicense(License newLicense) {
        try {
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
            File currentDir = new File(""); // Creates a new file
            String newFilePath = "jdbc:ucanaccess://" + currentDir.getAbsolutePath().toString() + "\store\data\database1.accdb";
            Connection conn = DriverManager.getConnection(newFilePath);
            Statement stmt = conn.createStatement();
            stmt.executeUpdate("INSERT INTO Licenses (Name, DateRedeemed, Expired, LicenseLength, Contact) VALUES "
                    //Values for the SQL Statement
                    + "('" + newLicense.getName()//Start Line
                    + "','" + newLicense.getRedeemed()//Middle Lines
                    + "','" + newLicense.getExpired()//Middle Lines
                    + "','" + newLicense.getLicenseLength()//Middle Lines
                    + "','" + newLicense.getContact()+ "')");//End Line

            conn.close();
            return true;
        } catch (Exception ex) {
            String message = ex.getMessage();
            System.out.println(message);
            return false;
        }
    }

一些额外的信息来帮助解决 table 名称是 Licenses 字段名称及其类型

更新 我使用 Access 中的查询设计创建了一个查询,这很好地向数据库提供了信息,所以问题不在于 sql。

更新 当我重命名数据库中的 table 和 运行 应用程序时,我得到了同样的错误,但使用了 table 名称,我将创建一个新数据库,看看是否能解决任何问题

找到解决方案

LicenseLength 是一个 Int,但您将其用引号括起来,就像它是一个字符串一样。另外,您是否尝试过使用像

这样的参数化查询
String sql = "INSERT INTO Licenses (Name, DateRedeemed, Expired, LicenseLength, Contact) VALUES (?, ? ,?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, newLicense.getName());
stmt.setString(2, newLicense.getRedeemed());
stmt.setString(3, newLicense.getExpired());
stmt.setInt(4, newLicense.getLicenseLength());
stmt.setString(5, newLicense.getContact());

这纯粹是愚蠢的时刻,我创建了一个备份数据库,它保存在 fat jar 目录之外,因为当你创建一个 fat jar 时它会擦除文件夹。在某些时候,我打开它来测试忘记关闭的东西,这就是我添加许可证的地方 table。

因此,当我 运行 应用程序时,由于文件路径的原因,它实际上找不到 table,我通过测试其他方法解决了这个问题,我使用了 createUser() 方法显示它被写入哪个数据库。

对于其他用户

如果出现此错误,请尝试以下操作

  • 如果你像我一样使用一个大的 SQL 字符串,请应用 Joakim 的解决方案,因为它可能是你的 SQL 语句的问题。(以及更好的编程实践)

  • 查看您的 Table 名称和字段,确保它们与您的 SQL

  • 完全相同
  • 运行 您的应用程序并在它以前工作的地方测试另一个方法,如果成功检查应用程序在哪里写入了值

  • 如果所有其他方法都失败了,请删除该方法,从头开始键入它,不要复制和粘贴,创建一个新数据库,因为我之前在使用 tables 之间的关系时遇到过这个问题在我的访问数据库中

我希望这个解决方案可以帮助其他人解决这个问题。