【问题标题】:Strange problem with JDBC, select returns nullJDBC的奇怪问题,select返回null
【发布时间】:2010-10-28 13:23:17
【问题描述】:

我正在尝试使用 JDBC,但我的查询在某些情况下有效,但在其他情况下无效。 非常感谢任何帮助。

我的一些代码:

public Result getSpecificTopic()
    {
        String query = "Select msg_body, msg_author from lawers_topic_msg";// where msg_id=2 order by msg_id desc";
         try
        {
            con = mysql.getConnection();
            //Statement stmt = con.createStatement();
            PreparedStatement stmt = con.prepareStatement(query);
            //stmt.setInt(1, topicId);
            ResultSet rs = stmt.executeQuery(query);
            int rowCount = rs.getRow();
            specificTopic = ResultSupport.toResult(rs);

            con.close();
            stmt.close();
        }
        catch(Exception e)
        {
        }
        return this.specificTopic;
    }

    public void setTopicId(String num)
    {
        this.topicId = Integer.parseInt(num);
    }

    public int getTopicId()
    {
        return this.topicId;
    }

如果我改变了

String query = "Select msg_body, msg_author from lawers_topic_msg";

String query = "Select msg_body, msg_author from lawers_topic_msg where msg_id = " + topicId; 

然后结果集没有返回任何内容.... 我在这里打破了我的头,仍然无法弄清楚问题是什么

【问题讨论】:

  • 您是否尝试在运行前将查询打印到控制台?获取它的输出,然后直接针对您的数据库运行它。
  • 谢谢,你是对的。我希望我能给你评论接受的答案。

标签: java jsp jdbc


【解决方案1】:

您仍然没有正确关闭资源。这应该在 finally 块中完成:

http://www.java-blog.com/correct-closing-jdbc-resources

【讨论】:

  • 感谢您的链接和建议。我改了。
【解决方案2】:

作为第一步,确保没有抛出异常是值得的 - 至少在你的 catch() 块中记录一些内容。

还值得记录生成的 SQL,并确保在直接运行时实际返回您对数据库的期望。

如果您有多个数据库,那么值得确认您正在与您认为的那个数据库竞争 - 我很尴尬地承认我以前曾被这种方式发现过。

【讨论】:

    【解决方案3】:

    你的代码有几个问题,我会保持简短:

    不要在这一层用 try / catch 封装,特别是因为你没有进行错误管理。 this.specificTopic 看起来是全局的,因此如果您的查询失败,它将返回存储在 this.specificTopic 中的任何内容。

    也试试 BobbyShaftoe 所说的。在控制台中打印或使用您的调试器。这应该可以很好地指示您出了什么问题。

    【讨论】:

    • topicId 只是同一类中的私有变量。但是您发现直接通过数据库运行查询。
    【解决方案4】:

    我的第一个猜测是 Integer.parseInt(num) 可能会引发异常。如果是这样,sql语句将被破坏。

    其次,正如 Makach 所指出的,存在几个问题。首先是包罗万象

    你不应该使用字符串连接,比如

          ....where msg_id = " + topicId;
    

    而是

          ....where msg_id = ?"
             stmt.set Int(1,topicId)
    

    编辑:看来这就是你正在尝试的,所以有些角色很烂。

    【讨论】:

    • 感谢有关我的代码的建议。我现在把它改成了正确的方式。
    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 2011-02-02
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多