我正在开发一个用户可以组装瑜伽课程组件的项目。它分布在几个文件中,因此太大而无法放在这里。我遇到的麻烦是在一种方法中,我需要迭代结果集的水平列,该结果集只从MySQL数据库返回一行。
我知道我必须将光标定位在结果集的第一行(我相信我正在做)。由于我在结果集中只有一行(我的变量是rset),我应该只使用rset.next()一次,对吗?然后我应该能够使用一个简单的循环迭代每一列并将值附加到我的String Builder。我想跳过第一列并附加每个后续值,直到循环到达具有空值的列。我找不到为什么我的代码一直返回“结果集开始之前”异常。
有人能发现任何错误吗?
我将发布方法以及此方法调用的方法。 (我在另一个问题中发布了这个问题,但我相信我的问题的性质已经改变了,所以我用不同的标题重新发布了这个。)
// Query that returns the poses within a specific section
public String listPosesInSection(String tableName, String sectionName) {
String strList;
StringBuilder strBuilderList = new StringBuilder("");
// Run the query
try {
statement = connection.createStatement();
// Query will collect all columns from one specific row
rset = statement.executeQuery("SELECT * FROM " + tableName + " WHERE " + tableName + "_name = '" + sectionName + "'");
rset.next();
System.out.println("Column count is " + countColumnsInTable(tableName));
for (int i = 2; i <= countColumnsInTable(tableName); i++) {// First value (0) is always null, skip first column (1)
System.out.println("test");
strBuilderList.append(rset.getString(i) + "\n"); // This is line 126 as indicated in the exception message
}
} catch (SQLException e) {
e.printStackTrace();
}
strList = strBuilderList.toString();
return strList.replaceAll(", $",""); // Strips off the trailing comma
}
// Method for getting the number of columns in a table using metadata
public int countColumnsInTable(String sectionType) {
int count = 16;
try {
statement = connection.createStatement();
rset = statement.executeQuery("SELECT * FROM " + sectionType);
rsMetaData = rset.getMetaData();
count = rsMetaData.getColumnCount();
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
这是异常消息的第一部分:
Column count is 26
java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5773)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5693)
at YogaDatabaseAccess.listPosesInSection(YogaDatabaseAccess.java:126)
at YogaSectionDesigner$5.actionPerformed(YogaSectionDesigner.java:231)
答案 0 :(得分:4)
在我看来,就像你在两种方法之间重新使用rset
一样。因此,当countColumnsInTable
完成后,rset
变量指向的结果集与listPosesInSection
中的结果集不同。并且该结果集未使用next
提前,因此您收到的错误消息。您可能希望将其分配给该方法中的本地ResultSet
。
public int countColumnsInTable(String sectionType) {
int count = 16;
try {
Statement statement = connection.createStatement();
ResultSet rset = statement.executeQuery("SELECT * FROM " + sectionType);
ResultSetMetaData rsMetaData = rset.getMetaData();
count = rsMetaData.getColumnCount();
} catch (SQLException e) {
e.printStackTrace();
}
// Remember to clean up
return count;
}
答案 1 :(得分:1)
试试这个
public String listPosesInSection(String tableName, String sectionName) {
String strList;
StringBuilder strBuilderList = new StringBuilder("");
// Run the query
try {
statement = connection.createStatement();
// Query will collect all columns from one specific row
rset = statement.executeQuery("SELECT * FROM " + tableName + " WHERE " + tableName + "_name = '" + sectionName + "'");
while (rset.next()){
System.out.println("Column count is " + countColumnsInTable(tableName));
for (int i = 2; i <= countColumnsInTable(tableName); i++) {// First value (0) is always null, skip first column (1)
System.out.println("test");
strBuilderList.append(rset.getString(i) + "\n");
}
}
} catch (SQLException e) {
e.printStackTrace();
}
strList = strBuilderList.toString();
return strList.replaceAll(", $",""); // Strips off the trailing comma
}
答案 2 :(得分:1)
rset是一个ResultSet对象
我认为你在listPosesInSection和countColumnsInTable中使用相同的ResultSet对象
所以这里发生的事情是在listPosesInSection中,rset保存一个结果,你也移动了光标但是再次在countColumnsInTable中你使用相同的rset所以它被覆盖,即它现在保持一个新的结果,你得到的数量列,但由于它现在保持一个新的结果,光标将在第一个记录之前,所以在countColumnsInTable中使用不同的Resultset对象