私はCsvJdbc(csv-filesのJDBCドライバーです)を使用してcsv-fileにアクセスしています。csvファイルに含まれる列の数がわかりません。列の数を取得するにはどうすればよいですか?このためのJDBC関数はありますか?このためのメソッドがjava.sql.ResultSetに見つかりません。
ファイルへのアクセスには、CsvJdbc Webサイトの例と同様のコードを使用します。
回答:
ResultSetMetaDataから列番号を取得できます。
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();
PreparedStatement ps=con.prepareStatement("select * from stud");
ResultSet rs=ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
System.out.println("columns: "+rsmd.getColumnCount());
System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1));
System.out.println("Column Type Name of 1st column: "+rsmd.getColumnTypeName(1));
rs.getMetaData()
方法は、高価な?呼び出されるかどうかのたびにデータベースをクエリしますか?
rs.getMetaData()
呼び出しが集中する可能性が。ただし、オブジェクトを取得するとrsmd
、通常、メタデータオブジェクトでメソッドを呼び出すときに、データベースへの追加の呼び出しは行われません。すべてのメタデータにgetMetaData呼び出しが入力されます。
コードで取得できる結果セットの列の数(DBはPostgreSQLを使用しているため):
// PostgreSQLのドライバーをロードします Class.forName( "org.postgresql.Driver"); 文字列url = "jdbc:postgresql:// localhost / test"; プロパティprops = new Properties(); props.setProperty( "user"、 "mydbuser"); props.setProperty( "password"、 "mydbpass"); 接続conn = DriverManager.getConnection(url、props); //ステートメントを作成 ステートメントstat = conn.createStatement(); //結果セットを取得します ResultSet rs = stat.executeQuery( "SELECT c1、c2、c3、c4、c5 FROM MY_TABLE"); //結果セットからメタデータを与える ResultSetMetaData rsmd = rs.getMetaData(); //列はメタデータオブジェクトからカウントされます int numOfCols = rsmd.getColumnCount();
しかし、列に関するより多くのメタ情報を取得できます。
for(int i = 1; i <= numOfCols; i++)
{
System.out.println(rsmd.getColumnName(i));
}
そして、少なくとも大事なことですが、テーブルだけでなくDBについての情報も入手できます。その方法は、こことここにあります。
これにより、データが列に出力され、最後の列に到達すると新しい行になります。
ResultSetMetaData resultSetMetaData = res.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();
for(int i =1; i<=columnCount; i++){
if(!(i==columnCount)){
System.out.print(res.getString(i)+"\t");
}
else{
System.out.println(res.getString(i));
}
}
ResultSetMetaData
実装が可変長CSVレコードを処理する方法を理解することは興味深いでしょう。たとえば、指定SELECT * FROM sample
し、各行に異なる数のフィールドが含まれている場合、反復された各行の列数が再評価されますか?