为什么此查询返回NULL?
问题描述:
我有一个德比用户数据库,我查询时,当用户点击应用程序登录。为什么此查询返回NULL?
但是,当我用参数[user]查询users表时,derby返回一个空Object而不是它应该返回的记录。
这里是我的代码:
String ssql = "SELECT * FROM USERS WHERE UNAME LIKE ?";
try{
DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver());
con = DriverManager.getConnection(url);
sql = con.prepareStatement(ssql, Statement.RETURN_GENERATED_KEYS);
sql.setString(1, cbox_chooseUser.getSelectedItem().toString());
sql.executeQuery();
ResultSet rs = sql.getGeneratedKeys();
try{
while (rs.next()) {
if(rs.getString("PW").toCharArray().equals(txt_password.getPassword())){
sql.close();
con.close();
return true;
}
} catch (NPE ...) {...}
}
我尝试了多次机智测试用户同时与PW和用户名设置为“测试”;但我总是得到同样的错误。 为什么记录集始终为空?
感谢您的帮助:)
答
的ResultSet 的getGeneratedKeys()抛出的SQLException
获取由于执行此而创建的任何自动生成的键声明 对象。
如果此Statement对象没有生成任何键,空 ResultSet对象返回。
您的select语句不会生成任何键,这就是它返回空ResultSet的原因。你没有插入任何东西,因此没有生成密钥。
您可以尝试ResultSet rs = sql.executeQuery();
。它应该工作。
答
您正在以错误的方式使用它。
生成的密钥概念应仅用于DML insert
类型查询的情况,但不适用于select
查询的情况。
select
只需从表中选择行。在这种情况下,没有任何键生成的机会。
在insert
的情况下,如果任何列被配置为auto increment
或某种功能,那么会生成一些密钥。可以使用java中的Statement.RETURN_GENERATED_KEYS
捕获这些密钥。
由于您正在使用select
查询,因此无需使用Statement.RETURN_GENERATED_KEYS
。
你只要修改下面的行,一切都会好的。
sql = con.prepareStatement(ssql, Statement.RETURN_GENERATED_KEYS);
sql.setString(1, cbox_chooseUser.getSelectedItem().toString());
sql.executeQuery();
ResultSet rs = sql.getGeneratedKeys();
与
sql = con.prepareStatement(ssql);
sql.setString(1, cbox_chooseUser.getSelectedItem().toString());
ResultSet rs = sql.executeQuery();
的executeQuery已经返回结果。并且:您不应该使用“选择*”。你想要“PW”,所以“选择PW”... – Fildor
哪些键将从SELECT语句生成?你的意思是'ResultSet rs = sql.executeQuery();'? – Berger
你如何从'ResultSet'发布字符串结果? – zed