是啥导致错误“用户缺少权限或找不到对象: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 错误?