2012-01-16 13 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

+0

Btw:1次元配列が意味をなさないと思われる場合、 – home

答えて

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ループが開始され、今の内側ループのために、あなたはすべての要素を与えています名前の配列は同じ値、つまりrs.getString(i)ですが、あなたのクエリはあなたのrsの1つの列、つまり電子メールを返します(ただし、forループの中でnames [2] = rs.getString(2)、name [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 
     } 
    } 

うまくいけば、これが解決できるかもしれません。

よろしくお願いいたします。

+0

ありがとう、私はforループの "i"の値のような問題は、常に私は "name [j]"のような配列の別の変数を使用して1だったので、正常に動作しました。ありがとうございました – user1151442

+0

@ user1151442:ようこそ。それがあなたのために働いたことを知って幸せ。よろしく –

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

私はそれをString name [] = new String [100]のように初期化しました。それはグローバルスコープを持っています – user1151442

+0

グローバルスコープ? Javaでは? – Viruzzo

+1

Sense Uのグローバルスコープは、プログラム – user1151442

0

私はそれが名前の配列の各要素は、「ヌルを与えて」いないと思います。結果セットの列があるよりも、名前配列の要素が多いため、または結果セットの最後の行に実際にnull値が含まれているため(おそらく、最後の行以外のすべての行が配列をスローしているため)、おそらくnullが返されます。

サイドノート:

  • 0からJavaスタートで配列インデックスが配列の最初の要素には何も置かないあなたは、あなたがやっているような例外を無視するべきではありません
  • 疑問です。このメソッドでSQLExceptionを処理できない場合は、そのメソッドによってスローされ、無視されません。
  • 結果セット、ステートメント、および接続は、finallyブロック内で閉じる必要があります。
+0

を通して実際にそれにアクセスできますが、実際にはすべての要素に対してnullを返しますが、nullと共にResultSetの最後に返された値を返します。 – user1151442

+1

複数の行を格納する1次元配列があり、それぞれに複数の列が含まれています。どのようにこれを動作させるつもりですか?結果セットのすべての行で前の繰り返しで格納されたものを上書きするため、コードでは結果セットの最後の行のみが配列に格納されます。 –

関連する問題