是啥导致错误“用户缺少权限或找不到对象:FieldName”

Posted

技术标签:

【中文标题】是啥导致错误“用户缺少权限或找不到对象:FieldName”【英文标题】: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 【参考方案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 数据库中使用表之间的关系时遇到了这个问题

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

【讨论】:

以上是关于是啥导致错误“用户缺少权限或找不到对象:FieldName”的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致 cellForRowAtIndexPath 中的 outOfBounds 错误?

是啥导致发生分段错误?

是啥导致 HttpListener HTTP 503 错误?

Python MySQLdb错误 - 是啥导致了这个

NullPointerException,是啥导致我的错误?

是啥导致了这个“jpackage 不存在”错误?