2017-06-11 3 views
2

私はテーブルの列番号を表示したいが、それは常に私は以下のコード書かれている番号1を示しています。JavaのResultSet列数は常に1

Class.forName(JDBC_DRIVER); 
java.sql.Connection con=DriverManager.getConnection(DB_URL,USER,PASS); 

try (Statement stmt = (Statement) con.createStatement()) { 
      String sql; 

      sql = "SELECT count(*) FROM information_schema.columns WHERE 
        table_name=\"my_b\""; 

      try ( 
       ResultSet rs = stmt.executeQuery(sql)) { 
       int columCount = rs.getMetaData().getColumnCount(); 
       System.out.println("Column number is: "+columCount); 
      } 
      stmt.close(); 
      con.close(); 

エラーがあるの?

+0

: SELECT COUNT(*)FROMをinformation_schema.columns WHERE table_name = \ "my_b \" その後、正しい結果が得られます。 – user3395595

答えて

-2

あなたはすべての列を探している間、これは、単一の結果を返しますので、ジャストcount(*)を省略SELECT * FROM information_schema.columns WHERE table_name=\"my_b\"

を試してみてください。

+0

それから19が表示されますが、実際のカラム番号は3です。 – user3395595

+0

'information_schema.columns'は固定スキーマです。 'my_b'の列ごとに1つの列ではなく、' my_b'の列ごとに1つの* row *です。 – Brandon

-1
Class.forName(JDBC_DRIVER); 
java.sql.Connection con=DriverManager.getConnection(DB_URL,USER,PASS); 

try (Statement stmt = (Statement) con.createStatement()) { 
      String sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = 'database_name' AND table_name = 'table_name'" 

      try ( 
       ResultSet rs = stmt.executeQuery(sql)) { 
       //int columCount = rs.getMetaData().getColumnCount(); 
       ResultSetMetaData rsmd = rs.getMetaData(); 

       int columnsNumber = rsmd.getColumnCount(); 
       System.out.println("Column number is: "+columnsNumber); 


      } 
      stmt.close(); 
      con.close(); 
+0

まだ同じ出力...それは1を示しています。しかし、私はMySQLのターミナル上のsqlだけをテストしているとき、それは正しいansを与えます。 – user3395595

+0

あなたのクエリのための@ user3395595コードを更新しました – Akash

0

問題はResultSet.getColumnCountは、クエリの結果セットではなく、テーブルの列数の列数を返すことです。

テーブルの列の数を取得しようとしている場合は、クエリが正しいです。そのメタデータではなく、クエリの結果を取得するだけで済みます。

 String sql = "SELECT count(*) FROM information_schema.columns WHERE table_name=\"my_b\""; 

     try ( 
      ResultSet rs = stmt.executeQuery(sql)); 
      rs.next(); 
      int columCount = rs.getInt(1); 
      System.out.println("Column number is: " + columCount); 
     } 
+0

それは出力されません。 :( – user3395595

+0

)出力を出さなければならない。数が間違っていても、System.out.printlnは少なくとも何かを出力するだろう。例外などが出ていないか具体的にどうか – Brandon

+1

'rs.next() '最初に、結果セットは最初に** **最初の行の前に置かれます –

0

最初に、Class.forNameは、長時間JDBCドライバをロードする必要はありません。次に、値を選択していますが、メタデータを読み込んでいます。第3に、try-with-resourcesを使用する場合は、明示的な電話をかける必要はありません(Connectionfinallyなどで閉じなければなりません)。最後に、PreparedStatementとバインドパラメータを使用します。同様に、あなたは結果を求めている代わりに、クエリの結果を取得していない

java.sql.Connection con = DriverManager.getConnection(DB_URL, USER, PASS); 
String query = "SELECT count(*) FROM information_schema.columns WHERE table_name=?"; 
try (PreparedStatement stmt = con.prepareStatement(query)) { 
    stmt.setString(1, "my_b"); 
    try (ResultSet rs = stmt.executeQuery()) { 
     if (rs.next()) { 
      int columCount = rs.getInt(1); 
      System.out.println("Column number is: " + columCount); 
     } else { 
      System.out.println("No rows"); 
     } 
    } 
} finally { 
    con.close(); 
} 
0

は、結果セットを持っているどのように多くの列メタデータを設定します。クエリでは単一の列(つまりCOUNT(*))しか生成されないため、ResultSetMetaData.getColumnCount()の結果は1であり、その値は正しいです。

クエリの結果を取得したい場合は、結果セットからそれを取得する必要があります:私はこのtermina MySqlの上でテストしていた場合

try (ResultSet rs = stmt.executeQuery(sql)) { 
    if (rs.next()) { 
     int columnsNumber = rs.getInt(1); 
     System.out.println("Column number is: "+columnsNumber); 
    } 
}