2012-01-16 37 views
-3
String query = "select email from emp_select"; 
Statement stmt; 

try { 

    DB db=new DB(); 
    db.connect(); 
    stmt = (Statement) db.conn.createStatement(); // DB is connected here    

    ResultSet rs = stmt.executeQuery(query); 
    ResultSetMetaData rsmd = rs.getMetaData(); 

    int numberOfColumns = rsmd.getColumnCount(); 

    for (int i = 1; i <= numberOfColumns; i++) { 
    if (i > 1) 
     System.out.print(", "); 
    } 
    System.out.println(""); 

    while (rs.next()) { 
    for (int i = 1; i <= numberOfColumns; i++) { 
     if (i > 1) 
      System.out.print(", "); 

     String columnValue = rs.getString(i); 
     name[i]=columnValue; 
     System.out.println(name[i]);   //Everything executes well till here 
    } 
    } 
    stmt.close(); 
} catch(Exception ex) {} 

for (int i = 1; i < name.length; i++) { 
    System.out.println(name[i]); // why it gives null value here ? 
} 
+2

你在哪里声明'name'数组? – home 2012-01-16 08:19:59

+0

顺便说一句:给你的要求一维数组似乎没有意义... – home 2012-01-16 08:24:12

回答

1

我想知道这是你真正想要的:

while (rs.next()) { 
    for (int i = 1; i <= numberOfColumns; i++) { 
     if (i > 1) 
      System.out.print(", "); 

     String columnValue = rs.getString(i); 
     name[i]=columnValue; 
     System.out.println(name[i]);   //Everything executes well till here 
    } 
    } 

这里正在发生的事情是,while循环开始,现在for循环开始执行,现在里面的for循环中你是给所有元素的名称数组相同的值即rs.getString(i),但你的查询返回只有一列你的rs,即电子邮件(但你编码在你的for循环,如名称[2] = rs.getString(2) [3] = rs.getString(3),但这里没有什么比rs.getString(1))更多。似乎你应该做的是这个,这可能会给你预期的结果

for (int i = 1; i <= numberOfColumns; i++) { 
     if (i > 1) 
      System.out.print(", "); 
     if (rs.next()) // hope this works, not sure (but it does works for me at the click of a button, when used through Swing Events) 
     { 
      String columnValue = rs.getString(1);// Since only one thing is being returned by your rs object. 
      name[i]=columnValue; 
      System.out.println(name[i]);   //Everything executes well till here 
     } 
    } 

希望这可能可以解决。

Regards

+0

非常感谢你sooo我认为这个问题就像for循环中的“i”的值总是1,所以我使用了另一个变量,如“name [j]”。它工作正常..再次感谢 – user1151442 2012-01-16 13:45:27

+0

@ user1151442:您的欢迎。很高兴知道它为你工作。问候 – 2012-01-16 14:08:29

0

好让我这个版本的代码的改写这样的:

String query = "select email from emp_select"; 
Statement stmt; 

try { 

    DB db=new DB(); 
    db.connect(); 
    stmt = (Statement) db.conn.createStatement(); // DB is connected here    

    ResultSet rs = stmt.executeQuery(query); 
    ResultSetMetaData rsmd = rs.getMetaData(); 

    int numberOfColumns = rsmd.getColumnCount(); 
    List<String[]> names = new ArrayList<String[]>(); 
    String[] name=null; //assuming here you have only Varchar cols 

    while (rs.next()) { 
    name = new String[numberOfColumns]; 
    for (int i = 0; i <= numberOfColumns; i++) 
    { 
     name[i]=rs.getString(i); 
    } 
    names.add(name); 
    } 
    stmt.close(); 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 
for(String[] colResults : names) 
{ 
    for (int i = 0; i < colResults.length; i++) { 
     System.out.println(colResults[i]); 
    } 
} 
+0

我已经初始化它像字符串name [] = new String [100];它具有全球范围 – user1151442 2012-01-16 08:39:04

+0

全球范围?在Java中? – Viruzzo 2012-01-16 08:52:19

+1

Sense U中的全局作用域可以在整个程序中对其进行访问 – user1151442 2012-01-16 08:58:09

0

我想这不是“给空”为姓数组的每个元素。它可能是null,因为你的name数组中有更多的元素比结果集中有列,或者因为结果集的最后一行实际上包含空值(你正在抛出除最后一行外的所有行)。

旁注:在Java中

  • 数组的下标从0开始不把任何一个数组的第一个元素是值得商榷的
  • 像你这样做你永远不应该忽略的异常。如果在此方法中无法处理SQLException,则应该由方法抛出,而不是忽略。
  • 结果集,语句和连接应该在finally块中关闭。
+0

实际上,它将为所有元素返回null,但随后会为ResultSet返回最后返回的值以及null! – user1151442 2012-01-16 08:35:02

+1

您有一个一维数组来存储几行,每行都包含多列。你打算如何工作。您的代码只将结果集的最后一行存储在您的数组中,因为在结果集的每一行都会覆盖前一次迭代中存储的内容。 – 2012-01-16 08:39:45

相关问题