[英]Why does this Query return NULL?
当用户单击应用程序上的登录名时,我有一个查询的derby用户数据库。
但是,当我使用参数[user] derby查询用户表时,derby返回一个空对象,而不是应该返回的记录。
这是我的代码:
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和用户名都设置为“ test”的测试用户尝试了多次; 但我总是遇到同样的错误。 为什么记录集始终为Null?
谢谢你的帮助 :)
该文件说
ResultSet getGeneratedKeys()引发SQLException
检索由于执行此Statement对象而创建的任何自动生成的键。
如果此Statement对象未生成任何键,则返回一个空的ResultSet对象 。
您的select语句未生成任何键,这就是它返回空ResultSet的原因。 您不会插入任何内容,因此不会生成任何密钥。
您可以尝试ResultSet rs = sql.executeQuery();
。 它应该工作。
您以错误的方式使用它。
生成的键概念仅应在insert
类型查询的DML情况下使用,而在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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.