这段代码中的错误在哪里?

时间:2011-03-31 01:25:19

标签: java

在下面的代码中,如果条件失败,即当达到else块时,过程成功运行,否则抛出Closed Statement Exception:

 public synchronized void create(Map formMap) throws SQLException, Exception
  { 
    CallableStatement callStmt=null;    
    try
    {    
      String sql= "BEGIN UP_I_51(?, ?, ?, ?, ?, ?, ?, ?, ?); END;";   
      callStmt=getConnection().prepareCall(sql);
      callStmt.setString(1,formMap.get("periodFrom").toString());   
      callStmt.setString(2, formMap.get("periodTo").toString());
      String srcType=formMap.get("srcType").toString();
      callStmt.setString(3, srcType);
      callStmt.setString(4, formMap.get("collabIdMod").toString());
      callStmt.setString(5, formMap.get("name").toString());
      callStmt.setString(6, formMap.get("address").toString());
      callStmt.setString(7, " ");
      String parCollabId=formMap.get("pCollabId").toString();
      if(StringUtils.exists(parCollabId))
      {
        callStmt.setString(8, parCollabId);
        String parSrcType=getParentSrcType(srcType);
        callStmt.setString(9, parSrcType);
      }
      else
      {
        callStmt.setString(8, " ");
        callStmt.setString(9, " ");
      }   
      callStmt.executeUpdate(); 
    }
    finally
    {     
      callStmt.close();       
    }
  }

我用下面的代码替换了代码,它现在正在运行。我之前在设置字符串时使用了条件,但现在不知道为什么会出现异常。

我仍然不明白为什么会出现此异常。有谁能找到它?

 public synchronized void create(Map formMap) throws SQLException, Exception
  { 
        CallableStatement callStmt=null;    
        String srcType=formMap.get("srcType").toString();

        String parCollabId=formMap.get("pCollabId").toString();
        String parSrcType=getParentSrcType(srcType);
        try
        {    
            srcType=formMap.get("srcType").toString();
            parCollabId=formMap.get("pCollabId").toString();
            parSrcType=getParentSrcType(srcType);

            parCollabId = StringUtils.exists(parCollabId) ? parCollabId : " ";
            parSrcType = StringUtils.exists(parCollabId) ? parSrcType : " ";

            String sql= "{ call UP_I_51(?, ?, ?, ?, ?, ?, ?, ?, ?) }";  

          callStmt=getConnection().prepareCall(sql);
          callStmt.setString(1,formMap.get("periodFrom").toString());   
          callStmt.setString(2, formMap.get("periodTo").toString());

          callStmt.setString(3, srcType);
          callStmt.setString(4, formMap.get("collabIdMod").toString());
          callStmt.setString(5, formMap.get("name").toString());
          callStmt.setString(6, formMap.get("address").toString());
          callStmt.setString(7, " ");

          callStmt.setString(8, parCollabId);
          callStmt.setString(9, parSrcType);
          callStmt.executeUpdate(); 
        }catch(Exception e)
        {
            e.printStackTrace();
            throw e;
        }
        finally
        {     
          callStmt.close();       
        }
  }

1 个答案:

答案 0 :(得分:0)

有很多缺失,很难说你是如​​何使用它的,但是,如果你关闭连接,那么getConnection()会返回一些未打开的东西,这可能是你的问题。

您应该编写单元测试,并在同一测试中连续两次或三次调用,以确保它正常工作。

如果不是,您可能希望getConnection()确保在返回连接之前连接已打开。