我有一个derby用户数据库,当用户点击登录应用程序时,我会查询该数据库。
但是,当我使用参数[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和用户名设置为" test&#34 ;;但我总是得到同样的错误。 为什么记录集总是空的?
感谢您的帮助:)
答案 0 :(得分:4)
ResultSet getGeneratedKeys()抛出SQLException
检索由于执行此Statement而创建的任何自动生成的密钥 宾语。
如果此Statement对象未生成任何键,则为空 返回ResultSet对象。
您的select语句不会生成任何键,这就是它返回空ResultSet的原因。你没有插入任何东西,因此没有生成密钥。
您可以尝试ResultSet rs = sql.executeQuery();
。它应该工作。
答案 1 :(得分:1)
你使用的方式错误。
生成的密钥概念只应在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();