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_ONLY类型的结果集执行操作”。似乎当我得到最后一行,然后尝试遍历以编写电子表格时,抛出了错误。
2条答案
按热度按时间kx1ctssn1#
默认的ResultSet类型可能因连接类型而异。具体来说,通过JDBC连接到数据库时的默认ResultSet类型可能与通过SSH隧道连接时的不同。
在某些情况下,通过JDBC连接数据库时,默认的ResultSet类型可能设置为forward-only,这意味着游标只能在ResultSet中向前移动,而不能向后移动到前面的行。但通过SSH隧道连接时,默认结果集类型可以不同,并且可以允许在两个方向上滚动结果集。默认的结果集类型也可能取决于所使用的特定JDBC驱动程序。某些驱动程序的默认结果集类型可能为“仅向前”,而其他驱动程序的默认结果集类型可能为“可滚动”。
在使用Statement对象创建ResultSet之前,可以通过调用该对象上的getResultSetType()方法来检查JDBC驱动程序的默认ResultSet类型。
您可以尝试在创建Statement对象时通过传递常量ResultSet.TYPE_SCROLL_INSENSITIVE作为第一个参数来显式设置ResultSet类型。
jjjwad0x2#
您可以将外部循环重新设计为do...while样式,使用
ResultSet#next()
在ResultSet行中前进,使用ResultSet#isLast()
知道何时停止。添加电子表格行的
for
循环对于每个ResultSet行只运行一次,但是您已经设置为循环通过ResultSet行,因此不需要在那里执行额外的循环。