3

我的 JAVA 脚本由 2 个 JAVA 类组成:RMSqueryRMSRMS类中我调用类中的queryRMS方法

RMS Java 类(我省略了开始执行部分,下面只是方法)

    for (int i = 1; i <= itemCount; i++) {
        GlobalVariables.numberRow = i;
        JavaDatapool.settings();

        String item = queryRPM.connectDB_Multi(configFile,"SELECT ITEM FROM ORDSKU WHERE ORDER_NO  = '" + orderNo + "' ORDER BY ITEM ASC",i);
        JavaDatapool.writeXLS("item",item,GlobalVariables.sheetXLS);
        sleep(1);

    }

查询RMS JAVA类

public static String connectDB_Multi(String configFile, String query, int i) throws FileNotFoundException, IOException, SQLException, ClassNotFoundException{
    Properties p = new Properties();
    p.load(new FileInputStream(configFile));

    String serverName = (p.getProperty("RMS_DBServerName"));
    String portNumber = (p.getProperty("RMS_PortNumber"));
    String sid = (p.getProperty("RMS_SID"));
    String url = "jdbc:oracle:thin:@//" + serverName + ":" + portNumber + "/" + sid;
    String username = (p.getProperty("RMS_Username"));
    String password = (p.getProperty("RMS_Password"));
    //  jdbc:oracle:thin:@//localhost:1521/orcl

    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection connection = DriverManager.getConnection(url,username,password);     
    String setr = null;
    try {      
        Statement stmt = connection.createStatement();

        try {ResultSet rset = stmt.executeQuery(query);
            try {
                while(rset.absolute(i))   
                    setr = rset.getString(1);
                    return setr;  
            }        
            finally {
                try { rset.close(); 
                } 
                catch (Exception ignore) {}

            }
        } 
        finally {
            try { stmt.close(); 
            } 
            catch (Exception ignore) {}
        }
    } 
    finally {
        try { connection.close(); 
        } 
        catch (Exception ignore) {}

    }
}

所以它所做的是调用connectDB_multi类,然后返回字符串,下一部分将其保存在 Excel 工作表中。

循环应该一次返回所有行,然后将其保存在 Excel 工作表中。

在第二次循环中,查询出现故障,即使查询应返回由 2 行组成的 1 列。

原件包含该部分while(rset.next()),而不是while(rset.absolute(i)) 但接下来每次只返回第一行。所以当从数据库中只检索到一列和一行时,该脚本就可以工作。

4

3 回答 3

5

你的逻辑看起来有点混乱。

查看您发布的第一个循环。您正在有效地执行:

SELECT ITEM FROM ORDSKU WHERE ORDER_NO = '" + orderNo + "' ORDER BY ITEM ASC

itemCount次数。每次执行它时,您都在尝试访问第n行,n 是循环计数器。你看到那里有问题吗?你怎么知道查询会返回itemCount的行数?因为如果不这样做,它将失败,因为您正在尝试访问不存在的行。

我怀疑你想做的是这样的

Statement stmt = connection.createStatement();
ResultSet rset = stmt.executeQuery(query);
while(rset.next()) {
    JavaDatapool.writeXLS("item",rset.getString(1),GlobalVariables.sheetXLS);
}

您还应该认真考虑使用某种形式的连接池来避免必须一直重新打开新连接,因为这是一个非常耗时的操作。

于 2011-11-25T08:16:24.850 回答
1

此代码似乎非常低效,对于您要从数据库中获取的每一行,您读取一个属性文件,创建一个连接,选择所有匹配的行,跳到您想要的行并仅返回该行。(或者至少我认为这就是你想要做的)。

你的代码

while(rset.absolute(i))   
    setr = rset.getString(1);

可能是一个无限循环,因为只要可以转到该行,它将继续转到同一行,因此该行不存在(并且 while 存在)或该行确实存在(并且 while 永远持续)。

您可能应该重组您的程序,使其只进行一次选择并读取您想要的所有行并将它们存储在您的 excel 文件中。在执行此操作时,您可以调试以查看您是否确实获得了您期望的数据。

除了创建新连接和为每一行查询一次的低效代码之外,你怎么知道你想要多少行?

我想你最终想要这样的东西

....
while(rset.next()) {
    JavaDatapool.writeXLS("item",item,GlobalVariables.sheetXLS);
}

什么是 sleep(1) 支持来完成的?

于 2011-11-25T08:34:07.837 回答
0

仅供参考:如果您按照逻辑或 pap 的解决方案过于频繁地打开和关闭语句,您可能会收到“java.sql.SQLException: ORA-01000: maximum open cursors exceeded”错误消息。

我建议你不要做“太多概括”。我看到很多 OOP 程序员过度概括,这很痛苦。您应该根据目标进行设计,目标不应该是“只是对齐”或“代码看起来很漂亮”,它必须有设计目的。

于 2011-11-25T09:01:31.297 回答