【问题标题】:What is causing the error 'User lacks privilege or object not found: FieldName'是什么导致错误“用户缺少权限或找不到对象:FieldName”
【发布时间】:2019-06-25 10:17:05
【问题描述】:

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

当代码运行时,它会吐出一个错误说明'用户缺少权限或找不到对象: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;
        }
    }

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

  • ID - Autonumber
  • 姓名 - String
  • 赎回日期 - String
  • 已过期 - String
  • 许可证长度-int
  • 联系方式-String

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

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

找到解决方案

【问题讨论】:

  • 请不要将值连接到 SQL 字符串中。学会正确使用PreparedStatement

标签: sql ms-access jdbc ucanaccess


【解决方案1】:

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());

【讨论】:

  • 我在 sql 和两个引号中都使用了查询设计,但没有正常工作,我也尝试了您的解决方案,但我收到错误“没有合适的方法用于 prepareStatement(无参数)”
  • @RyanMacPhee 我的拼写错误,sql 字符串应该是参数(您可以在文档中看到)。我更新我的答案
  • 哦,在我输入它之后意识到我只是没有调用 sql 字符串
  • 试过了,但似乎没有解决问题,同样的错误,我将在未来的数据库方法中使用这种格式,因为这似乎比尝试编写完整的 sql 字符串更有效.谢谢你的 Joakim
【解决方案2】:

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

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

对于其他用户

如果您收到此错误,请尝试以下操作

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

  • 查看您的表名和字段,确保它们与您的 SQL 完全相同

  • 运行您的应用程序并在之前工作的地方测试另一个方法,如果成功检查应用程序写入值的位置

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

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

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2017-06-14
    • 2019-05-31
    • 2017-08-31
    相关资源
    最近更新 更多