📄 jdbcresultset.java
字号:
/*
* Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.jdbc;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
//#ifdef JDK16
/*
import java.sql.NClob;
import java.sql.RowId;
import java.sql.SQLXML;
*/
//#endif
import org.h2.constant.ErrorCode;
import org.h2.constant.SysProperties;
import org.h2.engine.Constants;
import org.h2.engine.SessionInterface;
import org.h2.message.Message;
import org.h2.message.TraceObject;
import org.h2.result.ResultInterface;
import org.h2.result.UpdatableRow;
import org.h2.util.DateTimeUtils;
import org.h2.util.IOUtils;
import org.h2.util.MathUtils;
import org.h2.util.ObjectUtils;
import org.h2.util.StringUtils;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueBoolean;
import org.h2.value.ValueByte;
import org.h2.value.ValueBytes;
import org.h2.value.ValueDate;
import org.h2.value.ValueDecimal;
import org.h2.value.ValueDouble;
import org.h2.value.ValueFloat;
import org.h2.value.ValueInt;
import org.h2.value.ValueLong;
import org.h2.value.ValueNull;
import org.h2.value.ValueShort;
import org.h2.value.ValueString;
import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp;
/**
* Represents a result set. Column names are case-insensitive, quotes are not
* supported. The first column has the column index 1. Result sets are updatable
* when the result only contains columns from one table, and if it contains all
* columns of a unique index (primary key or other) of this table.
*/
public class JdbcResultSet extends TraceObject implements ResultSet {
private final SessionInterface session;
private final boolean closeStatement;
private final boolean scrollable;
private ResultInterface result;
private JdbcConnection conn;
private JdbcStatement stat;
private int columnCount;
private boolean wasNull;
private Value[] insertRow;
private Value[] updateRow;
private HashMap columnNameMap;
JdbcResultSet(SessionInterface session, JdbcConnection conn, JdbcStatement stat, ResultInterface result, int id, boolean closeStatement, boolean scrollable) {
setTrace(session.getTrace(), TraceObject.RESULT_SET, id);
this.session = session;
this.conn = conn;
this.stat = stat;
this.result = result;
columnCount = result.getVisibleColumnCount();
this.closeStatement = closeStatement;
this.scrollable = scrollable;
}
/**
* Moves the cursor to the next row of the result set.
*
* @return true if successful, false if there are no more rows
*/
public boolean next() throws SQLException {
try {
debugCodeCall("next");
checkClosed();
return nextRow();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Gets the meta data of this result set.
*
* @return the meta data
*/
public ResultSetMetaData getMetaData() throws SQLException {
try {
int id = getNextId(TraceObject.RESULT_SET_META_DATA);
if (debug()) {
debugCodeAssign("ResultSetMetaData", TraceObject.RESULT_SET_META_DATA, id, "getMetaData()");
}
checkClosed();
String catalog = conn.getCatalog();
JdbcResultSetMetaData meta = new JdbcResultSetMetaData(this, null, result, catalog, session.getTrace(), id);
return meta;
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns whether the last column accessed was a null value.
*
* @return true if the last column accessed was a null value
*/
public boolean wasNull() throws SQLException {
try {
debugCodeCall("wasNull");
checkClosed();
return wasNull;
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Searches for a specific column in the result set. A case-insensitive
* search is made.
*
* @param columnName the name of the column label
* @return the column index (1,2,...)
* @throws SQLException if the column is not found or if the result set is
* closed
*/
public int findColumn(String columnName) throws SQLException {
try {
debugCodeCall("findColumn", columnName);
return getColumnIndex(columnName);
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Closes the result set.
*/
public void close() throws SQLException {
try {
debugCodeCall("close");
closeInternal();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
void closeInternal() throws SQLException {
if (result != null) {
try {
result.close();
if (closeStatement && stat != null) {
stat.close();
}
} finally {
columnCount = 0;
result = null;
stat = null;
conn = null;
insertRow = null;
updateRow = null;
}
}
}
/**
* Returns the statement that created this object.
*
* @return the statement or prepared statement, or null if created by a
* DatabaseMetaData call.
*/
public Statement getStatement() throws SQLException {
try {
debugCodeCall("getStatement");
checkClosed();
if (closeStatement) {
// if the result set was opened by a DatabaseMetaData call
return null;
}
return stat;
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Gets the first warning reported by calls on this object.
*
* @return null
*/
public SQLWarning getWarnings() throws SQLException {
try {
debugCodeCall("getWarnings");
checkClosed();
return null;
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Clears all warnings.
*/
public void clearWarnings() throws SQLException {
try {
debugCodeCall("clearWarnings");
checkClosed();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
// =============================================================
/**
* Returns the value of the specified column as a String.
*
* @param columnIndex (1,2,...)
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public String getString(int columnIndex) throws SQLException {
try {
debugCodeCall("getString", columnIndex);
return get(columnIndex).getString();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a String.
*
* @param columnName the name of the column label
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public String getString(String columnName) throws SQLException {
try {
debugCodeCall("getString", columnName);
return get(columnName).getString();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as an int.
*
* @param columnIndex (1,2,...)
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public int getInt(int columnIndex) throws SQLException {
try {
debugCodeCall("getInt", columnIndex);
return get(columnIndex).getInt();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as an int.
*
* @param columnName the name of the column label
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public int getInt(String columnName) throws SQLException {
try {
debugCodeCall("getInt", columnName);
return get(columnName).getInt();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a String.
*
* @param columnIndex (1,2,...)
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
try {
debugCodeCall("getBigDecimal", columnIndex);
return get(columnIndex).getBigDecimal();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a java.sql.Date.
*
* @param columnIndex (1,2,...)
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public Date getDate(int columnIndex) throws SQLException {
try {
debugCodeCall("getDate", columnIndex);
return get(columnIndex).getDate();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a java.sql.Time.
*
* @param columnIndex (1,2,...)
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public Time getTime(int columnIndex) throws SQLException {
try {
debugCodeCall("getTime", columnIndex);
return get(columnIndex).getTime();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a java.sql.Timestamp.
*
* @param columnIndex (1,2,...)
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public Timestamp getTimestamp(int columnIndex) throws SQLException {
try {
debugCodeCall("getTimestamp", columnIndex);
return get(columnIndex).getTimestamp();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a String.
*
* @param columnName the name of the column label
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public BigDecimal getBigDecimal(String columnName) throws SQLException {
try {
debugCodeCall("getBigDecimal", columnName);
return get(columnName).getBigDecimal();
} catch (Throwable e) {
throw logAndConvert(e);
}
}
/**
* Returns the value of the specified column as a java.sql.Date.
*
* @param columnName the name of the column label
* @return the value
* @throws SQLException if the column is not found or if the result set is closed
*/
public Date getDate(String columnName) throws SQLException {
try {
debugCodeCall("getDate", columnName);
return get(columnName).getDate();
} catch (Throwable e) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -