2011-06-14 40 views
3

我有我从我的数据库中提取一个结果:如何把一个结果为Array使用多次

 String selStmt = "SELECT code_id, internal_code, representation, pos, decode(substr(internal_code, 5, 1), 'Q', 2, 1) as sorter, " 
       + "  to_char(term_start, 'MM-DD-YYYY') as sDate " 
       + " FROM table1, terms WHERE code_id = 'SEARCH.TERMS' AND internal_code = terms.terms_id (+) ORDER BY 5, 4 "; 

    stmt = conn.prepareStatement(selStmt); 
    result = stmt.executeQuery(); 

我想现在要做的就是把这些结果到一个数组,我知道我可以使用while循环来循环并获得结果,但是我只能使用那些,我需要在整个页面的其余部分继续使用它们。我想这可以使用数组来完成,但是如果有更简单的方法,请告诉我,如果需要更多信息,请让我知道。

回答

1

没有我知道的用于Java的DataSet(.NET)。因此,可以考虑类似如下:

ArrayList<Integer> data = new ArrayList<Integer>(); 

ResultSet rs = ....; 

// For each record in the result...  
while (rs.next()) { 
    // Want more values? Create a custom Type representing the Row! 
    // The following is just an example taking the first column (as an int). 
    // This would be done manually for each column... and possibly loadeded 
    // in a custom object which is then added to the list... blah blah. 
    // (Alternatively each row could be represented as Object[] or List<Object> 
    // at the expense of losing static typing.) 
    int id = rs.getInt(0); 
    data.add(id); 
} 

// Then later, if you *really* want an array... 
// (Java is such a backwards language and lacks a trivial way 
// to go to int[] from Integer[] but I digress...) 
Integer[] array = data.toArray(new Integer[0]); 

快乐编码

+0

这不会工作,因为getInt()必须以1而不是0 – Timo 2014-05-31 13:28:16

0

一个数组可能是实现它的方法。在你的while循环之前初始化它,在while循环中填充它,然后使用它:)

+0

好吧,我不确定的部分是“在你的while循环中填充它”我可以初始化,我只是不能得到填充的数组工作 – Dan 2011-06-14 18:55:45

2

既然你不知道事先的行数,我实际上会选择ArrayList。然后,您可以随意插入自定义对象(从结果集构建)。

1

您可以将数据存储在二维数组中。但更友好的方法是创建一个对象来表示一行数据所代表的内容,并从ResultSet创建这些对象的列表。

要拉取数据,只需循环遍历ResultSet,然后为每个循环创建一个新的自定义对象实例并将其添加到列表中。

1

的标准方法是遍历ResultSet中一次和(可能)的每个记录存储在数组中哪位以后可以遍历并随你喜欢。这就是大多数的答案,这是正确的。

相关的一点就是:你(显然)喜欢保持在每个next()调用ResultSet返回(这样就可以每个记录存储在一个ArrayList“原始”的记录,并把它作为一个滚动 ResultSet或类别)。我认为不能这样做,我坚信,在大多数情况下,这是一个坏主意。 ResultSet属于JDBC层,它是一个相当低层的层,它有它的问题和缺陷。一般来说,ResultSet应尽快完成并关闭,不应泄漏到上层。对于“完成”,我的意思是将它循环并为每个curson位置构建自己的Java对象(使用与JDBC api不相关的方法)。这就是大多数人和框架(例如iBatis)所做的事情,而且在大多数情况下,这样做是不好的做法。

例如,我曾经被看做是(伪代码)实施了一些伪道:

public ResultSet getUsers() { 
     conn = openConnection(); 
     stmt = conn.prepareStatement(...); 
     result = stmt.executeQuery(); 
     stmt.close(); 
     conn.close(); 
     return result; 
    } 

,主叫方将随后遍历结果集。这太可怕了,可能会失败,因为结果集可能会尝试从数据库获取数据(但连接已关闭!)。

如果你真的想这样做,你应该看看RowSet类。但我认为它没有多大用处。

1

有一次我用下面的代码来解决类似的挑战:

Vector rows = new Vector(); 
Vector nrow; 
int cnt = 0; 

while(result.next()) 
{ 
    nrow=new Vector(); 
    cnt+=1; 
    nrow.addElement(String.valueOf(cnt)); 
    for(int i=1;i<=3;i++) //replace 3 with the length of the columns 
    { 
     nrow.addElement(result.getObject(i)); 
    } 
    rows.addElement(nrow); 
} 

现在,你可以通过行循环,并利用数据的,只要你喜欢。每次迭代返回的每个对象都包含整个行数据。

0

如果您需要在整个页面中不断引用它们,则另一种可能性是使用HashMap存储行。为索引使用数据库的主键。

这样您可以根据需要快速引用特定的行。如果你只需要循环遍历结果集,而不是像刚才所说的那样在这里工作的很好。