在sqlite表中查找名称并返回id?

时间:2018-06-13 18:07:24

标签: java sql sqlite select jdbc

我尝试做的事情似乎很简单,但我收到此错误SQLITE_ERROR] SQL error or missing database (no such column: user1)

public String getIdUser(String name) {
        try {
            this.stat = conn.createStatement();
            String sql = "SELECT id_user FROM User WHERE name = " + name;
            ResultSet user = stat.executeQuery(sql);
            return user.toString();
        } catch (SQLException e) {
            return  null;
        }
}

3 个答案:

答案 0 :(得分:2)

替换

String sql = "SELECT  FROM User WHERE name = " + name;

String sql = "SELECT * FROM User WHERE name = " + name; // you can also specify a column/columns instead of *

答案 1 :(得分:2)

在不引用name字符串的情况下,它被解释为列名,因此您看到错误。你可以使用单引号将其包围起来,但这仍然是一种不好的做法,并且会使代码容易受到SQL注入攻击。

此外,您缺少选择列表(特别是id_user列),并且缺少从结果集中获取它。 最后,你忘了关闭语句和结果集。

如果你把所有这些修正放在一起,你应该使用这样的东西:

public String getIdUser(String name) {
    try (PreparedStatmet ps = 
         conn.prepareStatement("SELECT id_user FROM User WHERE name = ?")) {

        ps.setString(1, name);
        try (ResultSet rs = stat.executeQuery()) {
            if (rs.next()) {
                return rs.getString(1);
            }
        }
    } catch (SQLException ignore) {
    }
    return null;
}

答案 2 :(得分:2)

我在您的代码中发现了许多问题:

第一

您的查询应返回应该是的内容:

SELECT col_name1, col_name2, ... FROM User ...

或者如果你想选择所有东西:

SELECT * FROM User ...

第二

String或Varchar应该在两个引号之间,例如,您的查询应该如下所示:

SELECT col_name1 FROM User WHERE name = 'name'

第三

我不建议使用查询的串联而不是使用Prepared Statement它更安全,更有帮助(我将提供一个示例)

第四

要获得结果,您必须移动光标,您必须调用result.next()

第五

变量名称应该很重要,例如ResultSet应该是ResultSet rs而不是ResultSet user

您的最终代码可以是:

PrepareStatement prst = conn.prepareStatement("SELECT colName FROM User WHERE name = ?");
prst.setString(1, name);
ResultSet rs = prst.executeQuery();
if(rs.next()){
   reuturn rs.getString("colName");
}