2017-02-23 148 views
0

我有一个德比用户数据库,我查询时,当用户点击应用程序登录。为什么此查询返回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和用户名设置为“测试”;但我总是得到同样的错误。 为什么记录集始终为空?

感谢您的帮助:)

+2

的executeQuery已经返回结果。并且:您不应该使用“选择*”。你想要“PW”,所以“选择PW”... – Fildor

+3

哪些键将从SELECT语句生成?你的意思是'ResultSet rs = sql.executeQuery();'? – Berger

+0

你如何从'ResultSet'发布字符串结果? – zed

回答

4

documentation

的ResultSet 的getGeneratedKeys()抛出的SQLException

获取由于执行此而创建的任何自动生成的键声明 对象。

如果此Statement对象没有生成任何键,空 ResultSet对象返回。

您的select语句不会生成任何键,这就是它返回空ResultSet的原因。你没有插入任何东西,因此没有生成密钥。

您可以尝试ResultSet rs = sql.executeQuery();。它应该工作。

1

您正在以错误的方式使用它。

生成的密钥概念应仅用于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();