导致错误的原因 '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
字段名称及其类型
- ID -
Autonumber
- 姓名 -
String
- 兑换日期 -
String
- 已过期 -
String
- 许可证长度-
int
- 联系人-
String
更新
我使用 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 之间的关系时遇到过这个问题在我的访问数据库中
我希望这个解决方案可以帮助其他人解决这个问题。
使用 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 字段名称及其类型
- ID -
Autonumber
- 姓名 -
String
- 兑换日期 -
String
- 已过期 -
String
- 许可证长度-
int
- 联系人-
String
更新 我使用 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 之间的关系时遇到过这个问题在我的访问数据库中
我希望这个解决方案可以帮助其他人解决这个问题。