Java에서 ResultSet을 사용하여 행 수를 얻는 방법은 무엇입니까?
ResultSet을 매개 변수로 받고 ResultSet의 행 수를 포함하는 int를 반환하는 간단한 메서드를 만들려고합니다. 유효한 방법입니까?
int size = 0;
try {
while(rs.next()){
size++;
}
}
catch(Exception ex) {
System.out.println("------------------Tablerize.getRowCount-----------------");
System.out.println("Cannot get resultSet row count: " + ex);
System.out.println("--------------------------------------------------------");
}
나는 시도 시도했다 :
int size = 0;
try {
resultSet.last();
size = resultSet.getRow();
resultSet.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return size;
하지만 오류가 발생했습니다. com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.
포인터에 미리 감사드립니다!
이 결과 집합을 생성하는 준비된 문에 액세스 할 수있는 경우 다음을 사용할 수 있습니다.
connection.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
이렇게하면 커서를 되 감을 수있는 방식으로 명령문이 준비됩니다. 이는 ResultSet Javadoc 에도 문서화되어 있습니다.
그러나 일반적으로 커서를 전달 및 되 감은 큰 결과 집합의 경우 매우 비효율적입니다. SQL Server의 또 다른 옵션은 SQL 문에서 직접 총 행 수를 계산하는 것입니다.
SELECT my_table.*, count(*) over () total_rows
FROM my_table
WHERE ...
SQL 문 생성 코드는 다음과 같을 수 있습니다.
statement = connection.createStatement();
"com.microsoft.sqlserver.jdbc.SQLServerException : 요청 된 작업은 전달 전용 결과 집합에서 지원되지 않습니다."
statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
위의 변경 후 사용할 수 있습니다.
int size = 0;
try {
resultSet.last();
size = resultSet.getRow();
resultSet.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return size;
행 수를 얻을려면
Statement s = cd.createStatement();
ResultSet r = s.executeQuery("SELECT COUNT(*) AS rowcount FROM FieldMaster");
r.next();
int count = r.getInt("rowcount");
r.close();
System.out.println("MyTable has " + count + " row(s).");
여기에서는 JDBC가 다음 방법을 지원하지 않습니다. TYPE_FORWARD_ONLY '와 같은 오류가 발생합니다.
Sqlite는 JDBC에서 지원하지 않습니다.
resultSet.last();
size = resultSet.getRow();
resultSet.beforeFirst();
따라서 그때이 솔루션을 사용하십시오.
감사 ..
DO가 SELECT COUNT(*) FROM ...
대신 쿼리를.
방금 getter 메서드를 만들었습니다.
public int getNumberRows(){
try{
statement = connection.creatStatement();
resultset = statement.executeQuery("your query here");
if(resultset.last()){
return resultset.getRow();
} else {
return 0; //just cus I like to always do some kinda else statement.
}
} catch (Exception e){
System.out.println("Error getting row count");
e.printStackTrace();
}
return 0;
}
테이블이 있고 ID를 기본 및 자동 증분으로 저장하면 작동합니다.
총 행 수를 가져 오는 예제 코드 http://www.java2s.com/Tutorial/Java/0340__Database/GettheNumberofRowsinaDatabaseTable.htm
아래는 코드입니다
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
Connection conn = getConnection();
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
st.executeUpdate("create table survey (id int,name varchar(30));");
st.executeUpdate("insert into survey (id,name ) values (1,'nameValue')");
st.executeUpdate("insert into survey (id,name ) values (2,null)");
st.executeUpdate("insert into survey (id,name ) values (3,'Tom')");
st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM survey");
rs = st.executeQuery("SELECT COUNT(*) FROM survey");
// get the number of rows from the result set
rs.next();
int rowCount = rs.getInt(1);
System.out.println(rowCount);
rs.close();
st.close();
conn.close();
}
private static Connection getConnection() throws Exception {
Class.forName("org.hsqldb.jdbcDriver");
String url = "jdbc:hsqldb:mem:data/tutorial";
return DriverManager.getConnection(url, "sa", "");
}
}
함수는 ResultSet의 크기를 반환하지만 커서는 마지막 레코드 후에 설정되므로 beforeFirst (), first () 또는 previous ()를 호출하여 되 감지 않으면 행을 읽을 수없고 되감기 할 수 없습니다. 메서드는 전달 전용 ResultSet에서 작동하지 않습니다 (두 번째 코드 조각에서 발생하는 것과 동일한 예외가 발생합니다).
대부분의 드라이버는 순방향 결과 만 지원하므로 last, beforeFirst 등과 같은 방법은 지원되지 않습니다.
첫 번째 방법은 동일한 루프에서 데이터를 가져 오는 경우에도 적합합니다. 그렇지 않으면 resultSet이 이미 반복되어 다시 사용할 수 없습니다.
대부분의 경우 요구 사항은 행을 가져 오지 않고 쿼리가 반환 할 행 수를 가져 오는 것입니다. 결과 집합을 반복하여 행 수를 찾는 것은 데이터 처리와 거의 동일합니다. 대신 다른 count (*) 쿼리를 수행하는 것이 좋습니다.
다른 사람들은 이미 문제를 해결하는 방법에 대해 대답 했으므로 이미 말한 내용을 반복하지 않겠습니다.하지만 다음과 같이 말할 것입니다. 내용을 읽기 전에 결과 집합 수를 알지 못한 상태에서 문제를 해결하는 방법을 찾아야합니다. 결과.
특히 Java와 같은 언어에서는 결과 집합을 읽기 전에 실제로 행 수가 필요한 경우가 거의 없습니다. 행 개수가 필요한 유일한 경우는 행 개수가 필요한 유일한 데이터 일 때입니다 (이 경우 개수 쿼리가 더 우수합니다). 그렇지 않으면 래퍼 개체를 사용하여 테이블 데이터를 나타내고 이러한 개체를 ArrayList와 같은 동적 컨테이너에 저장하는 것이 좋습니다. 그런 다음 결과 집합이 반복되면 배열 목록 수를 얻을 수 있습니다. 결과 집합을 읽기 전에 행 수를 알아야하는 모든 솔루션에 대해 많은 노력없이 읽기 전에 행 수를 알지 못해도 그렇게하는 솔루션을 생각할 수 있습니다. 처리하기 전에 행 수를 알 필요가없는 솔루션을 생각하면
물론 결과 집합을 읽기 전에 행 개수가 필요할 수있는 상황이 없다고 말하는 것은 아닙니다. 저는 대부분의 상황에서 사람들이 읽기 전에 결과 집합 개수가 필요하다고 생각할 때 아마 필요하지 않을 것이며 다른 방법이 있는지 생각하는 데 5 분 정도 걸릴 가치가 있다고 말하고 있습니다.
주제에 대해 2 센트를 제공하고 싶었습니다.
ResultSet에는 제공된 옵션에 따라 커서를 앞뒤로 이동하는 메서드가 있습니다. 기본적으로 앞으로 이동합니다 (TYPE_FORWARD_ONLY 결과 집합 유형). CONSTANTS가 스크롤 가능성 및 결과 집합 업데이트를 제대로 나타내지 않으면 오류가 발생할 수 있습니다. 예 : beforeLast ()이 메서드는 결과 집합에 행이없는 경우 효과가 없습니다. TYPE_FORWARD_ONLY가 아닌 경우 오류가 발생합니다.
빈 행을 가져 왔는지 확인하는 가장 좋은 방법 --- 존재하지 않는지 확인한 후 새 레코드를 삽입하는 것
if( rs.next() ){
Do nothing
} else {
No records fetched!
}
다음은 배열을 인스턴스화하기 위해 개수를 얻지 않고 대신 ArrayList를 사용하고 반환하기 직전에 ArrayList를 필요한 배열 유형으로 변환하는 코드입니다.
여기서 Supervisor 클래스는 ISupervisor 인터페이스를 구현하지만 Java에서는 object [] (ArrayList의 일반 toArray () 메서드가 반환 됨)에서 ISupervisor [] (C #에서 할 수 있다고 생각하는 것처럼)로 캐스트 할 수 없습니다. 모든 목록 항목을 반복하고 결과 배열을 채워야합니다.
/**
* Get Supervisors for given program id
* @param connection
* @param programId
* @return ISupervisor[]
* @throws SQLException
*/
public static ISupervisor[] getSupervisors(Connection connection, String programId)
throws SQLException
{
ArrayList supervisors = new ArrayList();
PreparedStatement statement = connection.prepareStatement(SQL.GET_SUPERVISORS);
try {
statement.setString(SQL.GET_SUPERVISORS_PARAM_PROGRAMID, programId);
ResultSet resultSet = statement.executeQuery();
if (resultSet != null) {
while (resultSet.next()) {
Supervisor s = new Supervisor();
s.setId(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ID));
s.setFirstName(resultSet.getString(SQL.GET_SUPERVISORS_RESULT_FIRSTNAME));
s.setLastName(resultSet.getString(SQL.GET_SUPERVISORS_RESULT_LASTNAME));
s.setAssignmentCount(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ASSIGNMENT_COUNT));
s.setAssignment2Count(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ASSIGNMENT2_COUNT));
supervisors.add(s);
}
resultSet.close();
}
} finally {
statement.close();
}
int count = supervisors.size();
ISupervisor[] result = new ISupervisor[count];
for (int i=0; i<count; i++)
result[i] = (ISupervisor)supervisors.get(i);
return result;
}
다음 두 가지 옵션이 저에게 효과적이었습니다.
1) ResultSet의 행 수를 반환하는 함수.
private int resultSetCount(ResultSet resultSet) throws SQLException{
try{
int i = 0;
while (resultSet.next()) {
i++;
}
return i;
} catch (Exception e){
System.out.println("Error getting row count");
e.printStackTrace();
}
return 0;
}
2) COUNT 옵션을 사용하여 두 번째 SQL 문을 만듭니다.
에서 http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSetMetaData.html
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
ResultSet에는 행 수를 제공하는 메타 데이터가 포함됩니다.
참고 URL : https://stackoverflow.com/questions/7886462/how-to-get-row-count-using-resultset-in-java
'ProgramingTip' 카테고리의 다른 글
Android에서 난독 화 된 (ProGuard 사용) 애플리케이션으로 행동하는 방법은 무엇입니까? (0) | 2020.11.14 |
---|---|
IF EXISTS 하위 쿼리와 함께 SQL Select 문을 사용하는 방법은 무엇입니까? (0) | 2020.11.14 |
서블릿에 대한 요청이 HTTP 또는 HTTPS를 사용하여 실행 어떻게 알 수 있습니까? (0) | 2020.11.14 |
Liquid 마크 업으로 오늘 날짜를 Jekyll에서 확인하세요 (0) | 2020.11.14 |
K # 동적 개체에서 속성 값 가져 오기 (반사?) (0) | 2020.11.13 |