Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/wp_dashort", "dashort",
"gt9wkk6r1TPnkgrY");
PreparedStatement ps = null;
ps = connection.prepareStatement(mark_complete);
System.out.println("dateset");
dateof = dateof + " 00:00";
// ps.setString(1, dateof);
connection.createStatement();
ResultSet rs = ps.executeQuery();
Sheet sheet = workbook.createSheet("Security_Completions");
org.apache.poi.ss.usermodel.Row rowhead = sheet.createRow((short) 0);
System.out.println("Sheet created");
rowhead.createCell((short) 0).setCellValue("Column 1");
rowhead.createCell((short) 1).setCellValue("Column 2");
int size = 0;
rs.last();
size = rs.getRow();
rs.beforeFirst();
System.out.println("Number of records = " + size);
// Running thru the ResultSet
int index = 0;
int r = 0;
rs.next();
while (r < size) {
index = index + 1;
Row row = sheet.createRow((short) index);
for (int i = 0; i < 1; ++i) {
String value = rs.getString(1);
row.createCell(i).setCellValue(value);
row.createCell(1).setCellValue(StringUtils.left((rs.getString(2)), 16));
rs.next();
}
++r;
}
所以这段代码上周还能正常工作。这周我被迫使用SSH隧道会话连接到MySQL服务器。
我得到SQLException "操作不允许resultset类型的结果集。type_forward "似乎当我得到最后一行,然后尝试遍历编写电子表格时,抛出了错误。
根据连接的类型,默认的ResultSet类型可能会有所不同。具体来说,当通过JDBC连接到数据库时,默认的ResultSet类型可能与通过SSH隧道连接时不同。
在某些情况下,当通过JDBC连接到数据库时,默认的ResultSet类型可能被设置为forward-only,这意味着游标只能在ResultSet中向前移动,而不能移动到前一行。但是,当通过SSH隧道连接时,默认的ResultSet类型可能不同,并且可能允许在两个方向上滚动ResultSet。默认的ResultSet类型也可能取决于所使用的特定JDBC驱动程序。有些驱动程序可能有默认的ResultSet类型为仅向前,而其他驱动程序可能有默认的可滚动类型。
在用Statement对象创建ResultSet之前,您可以通过调用getResultSetType()方法来检查JDBC驱动程序的默认ResultSet类型。
您可以尝试在创建Statement对象时显式地设置ResultSet类型,通过传递常量ResultSet。TYPE_SCROLL_INSENSITIVE作为第一个参数
你可以把你的外循环重新设计成do…而样式使用ResultSet#next()
在ResultSet行中前进,ResultSet#isLast()
知道何时停止。
你的for
循环添加电子表格行只运行一次每个ResultSet行,但你已经设置通过ResultSet行循环,所以你不需要在那里做一个额外的循环。