[英]Need advice on fixing my JAVA query statement?
我的JAVA脚本由2个JAVA类组成: RMS
, queryRMS
在RMS
类中我调用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);
}
queryRMS 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
类,然后返回String,下一部分将它保存在Excel工作表中。
循环应该一次返回所有行,然后将其保存在Excel工作表中。
在第二次循环中,查询出现故障,尽管查询应该返回包含2行的1列。
原始包含部分while(rset.next())
而不是while(rset.absolute(i))
但接下来每次只返回第一行。 所以当从数据库中只检索到一列和一行时,脚本才有效。
你的逻辑看起来有点搞砸了。
看看你发布的第一个循环。 你有效地执行:
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);
}
您还应该认真考虑使用某种形式的连接池,以避免不得不一直重新打开新连接,因为这是一个非常耗时的操作。
此代码似乎效率非常低,对于要从数据库中读取的每一行,您读取属性文件,创建连接,选择所有匹配的行,向前跳到所需的行并返回该行。 (或者至少我认为这就是你要做的事情)。
你的代码
while(rset.absolute(i))
setr = rset.getString(1);
可能是一个无限循环,因为它可以继续到同一行,只要它可以去那一行,所以该行不存在(并且存在时)或行确实存在(并且永远继续) )。
您可能应该重新构建程序,只进行一次选择并读取所需的所有行并将它们存储在Excel文件中。 执行此操作时,您可以进行调试以查看是否确实获得了预期的数据。
除了为每行创建新连接和查询一次的低效代码之外,您如何知道您想要多少行?
我想最终你想要这样的东西
....
while(rset.next()) {
JavaDatapool.writeXLS("item",item,GlobalVariables.sheetXLS);
}
什么是睡眠(1)支持完成?
仅供参考:如果您经常打开和关闭语句作为逻辑或pap的解决方案,则可以获得“java.sql.SQLException:ORA-01000:超出最大打开游标数”错误消息。
我建议你不要“太多概括”。 我看到很多OOP程序员都过度泛化,这很痛苦。 你应该按目标设计,目标不应该是“只是对齐”,也不应该是“代码看起来很漂亮”,它必须有一个设计目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.