特定の行数を返すResultSet
を使用しました。私のコードは次のようなものです:
ResultSet res = getData();
if(!res.next())
{
System.out.println("No Data Found");
}
while(res.next())
{
// code to display the data in the table.
}
ResultSet
によって返される行数を確認する方法はありますか?または、自分で書く必要がありますか?
while
ループの代わりにdo ... while
ループを使用すると、次のように、ループの実行後にrs.next()
が呼び出されます。
if (!rs.next()) { //if rs.next() returns false
//then there are no rows.
System.out.println("No records found");
}
else {
do {
// Get data from the current row and use it
} while (rs.next());
}
または、行を自分で取得しながらカウントします。
int count = 0;
while (rs.next()) {
++count;
// Get data from the current row and use it
}
if (count == 0) {
System.out.println("No records found");
}
まず、コマンドでカーソルを移動できるStatement
を作成する必要があります。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
次に、以下のようにResultSet
を取得します。
ResultSet rs = stmt.executeQuery(...);
カーソルを最新の行に移動して取得します。
if (rs.last()) {
int rows = rs.getRow();
// Move to beginning
rs.beforeFirst();
...
}
次に、rows変数には、SQLによって返される行の数が含まれます
単純なgetRowCountメソッドは次のようになります。
private int getRowCount(ResultSet resultSet) {
if (resultSet == null) {
return 0;
}
try {
resultSet.last();
return resultSet.getRow();
} catch (SQLException exp) {
exp.printStackTrace();
} finally {
try {
resultSet.beforeFirst();
} catch (SQLException exp) {
exp.printStackTrace();
}
}
return 0;
}
このメソッドはスクロールセンシティブなresultSetを必要とすることに注意してください。そのため、接続の作成中にスクロールオプションを指定する必要があります。デフォルトはFORWARDで、このメソッドを使用すると例外がスローされます。
0行またはResultSetの一部の行を区別する別の方法:
ResultSet res = getData();
if(!res.isBeforeFirst()){ //res.isBeforeFirst() is true if the cursor
//is before the first row. If res contains
//no rows, rs.isBeforeFirst() is false.
System.out.println("0 rows");
}
else{
while(res.next()){
// code to display the rows in the table.
}
}
ResultSetが与えられた行の数を知る必要がある場合、それを取得するメソッドは次のとおりです。
public int getRows(ResultSet res){
int totalRows = 0;
try {
res.last();
totalRows = res.getRow();
res.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return totalRows ;
}
res.next()
メソッドは、次の行へのポインターを取得します。コードでは、最初にif条件(カーソルが最初の行に移動する)、次にwhile条件(カーソルが2番目の行に移動する)で2回使用しています。
そのため、結果にアクセスすると、2行目から始まります。そのため、結果で1行少なく表示されます。
これを試すことができます:
if(!res.next()){
System.out.println("No Data Found");
}
else{
do{
//your code
}
while(res.next());
}
Sqlでカウントし、次のように結果セットから回答を取得できます。
Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
td.setTotalNumRows(ct.getInt(1));
}
ここではすべてをカウントしていますが、基準に基づいてカウントするようにSQLを簡単に変更できます。
rs.last();
int rows = rs.getRow();
rs.beforeFirst();
ResultSetをTableModelにロードし、そのTableModelを使用するJTableを作成してから、table.getRowCount()メソッドを使用できます。クエリの結果を表示する場合は、とにかくそれを行う必要があります。
ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;
これは私の解決策
ResultSet rs=Statement.executeQuery("query");
int rowCount=0;
if (!rs.isBeforeFirst())
{
System.out.println("No DATA" );
} else {
while (rs.next()) {
rowCount++;
System.out.println("data1,data2,data3...etc..");
}
System.out.println(rowCount);
rowCount=0;
rs.close();
Statement.close();
}
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());
コードの最初の行は、結果セット内の任意の場所に移動できることを示しています(最初の行から最後の行、または最初の行の前に移動することができます)ここでクエリに一致すると(25レコード)、コードの3行目がカーソルを最後の行に移動し、コードの最終行が現在の行番号を取得します(私の場合は25です)。レコードがない場合、rs.lastは0を返し、getrowはカーソルを最初の行の前に移動します。したがって、負の値を返すと、dbにレコードがないことを示します。
クエリがこのSELECT Count(*) FROM tranbook
のようなものである場合、これを行うrs.next(); System.out.println(rs.getInt("Count(*)"));