Package net.sourceforge.jtds.jdbc
Class MSCursorResultSet
- java.lang.Object
-
- net.sourceforge.jtds.jdbc.JtdsResultSet
-
- net.sourceforge.jtds.jdbc.MSCursorResultSet
-
- All Implemented Interfaces:
java.lang.AutoCloseable
,java.sql.ResultSet
,java.sql.Wrapper
public class MSCursorResultSet extends JtdsResultSet
This class extends the JtdsResultSet to support scrollable and or updateable cursors on Microsoft servers.The undocumented Microsoft sp_cursor procedures are used.
Implementation notes:
- All of Alin's cursor result set logic is incorporated here.
- This logic was originally implemented in the JtdsResultSet class but on reflection it seems that Alin's original approch of having a dedicated cursor class leads to a more flexible and maintainable design.
- Version:
- $Id: MSCursorResultSet.java,v 1.59 2007/07/11 20:02:45 bheineman Exp $
- Author:
- Alin Sinpalean, Mike Hutchinson
-
-
Field Summary
Fields Modifier and Type Field Description private boolean
asyncCursor
The cursor is being built asynchronously.private static int
CURSOR_CONCUR_OPTIMISTIC
private static int
CURSOR_CONCUR_OPTIMISTIC_VALUES
private static int
CURSOR_CONCUR_READ_ONLY
private static int
CURSOR_CONCUR_SCROLL_LOCKS
private static java.lang.Integer
CURSOR_OP_DELETE
private static java.lang.Integer
CURSOR_OP_INSERT
private static java.lang.Integer
CURSOR_OP_UPDATE
private static int
CURSOR_TYPE_AUTO_FETCH
private static int
CURSOR_TYPE_DYNAMIC
private static int
CURSOR_TYPE_FASTFORWARDONLY
private static int
CURSOR_TYPE_FORWARD
private static int
CURSOR_TYPE_KEYSET
private static int
CURSOR_TYPE_PARAMETERIZED
private static int
CURSOR_TYPE_STATIC
private int
cursorPos
Actual position of the cursor.private static java.lang.Integer
FETCH_ABSOLUTE
private static java.lang.Integer
FETCH_FIRST
private static java.lang.Integer
FETCH_INFO
private static java.lang.Integer
FETCH_LAST
private static java.lang.Integer
FETCH_NEXT
private static java.lang.Integer
FETCH_PREVIOUS
private static java.lang.Integer
FETCH_RELATIVE
private static java.lang.Integer
FETCH_REPEAT
private ParamInfo[]
insertRow
The "insert row".private boolean
onInsertRow
Set whenmoveToInsertRow()
was called.private ParamInfo
PARAM_CURSOR_HANDLE
Cursor handle parameter.private ParamInfo
PARAM_FETCHTYPE
sp_cursorfetch
fetchtype parameter.private ParamInfo
PARAM_NUMROWS_IN
sp_cursorfetch
numrows IN parameter (for actual fetches).private ParamInfo
PARAM_NUMROWS_OUT
sp_cursorfetch
numrows OUT parameter (for FETCH_INFO).private ParamInfo
PARAM_OPTYPE
sp_cursor
optype parameter.private ParamInfo
PARAM_ROWNUM
sp_cursor
rownum parameter.private ParamInfo
PARAM_ROWNUM_IN
sp_cursorfetch
rownum IN parameter (for actual fetches).private ParamInfo
PARAM_ROWNUM_OUT
sp_cursorfetch
rownum OUT parameter (for FETCH_INFO).private ParamInfo
PARAM_TABLE
sp_cursor
table parameter.private java.lang.Object[][]
rowCache
The row cache used insteadJtdsResultSet.currentRow
.private static java.lang.Integer
SQL_ROW_DELETED
The row has been deleted.private static java.lang.Integer
SQL_ROW_DIRTY
The row is dirty and needs to be reloaded (internal state).private static java.lang.Integer
SQL_ROW_SUCCESS
The row is valid.private ParamInfo[]
updateRow
The "update row".-
Fields inherited from class net.sourceforge.jtds.jdbc.JtdsResultSet
cancelled, CLOSE_CURSORS_AT_COMMIT, closed, columnCount, columns, concurrency, currentRow, cursorName, direction, fetchDirection, fetchSize, HOLD_CURSORS_OVER_COMMIT, INITIAL_ROW_COUNT, pos, POS_AFTER_LAST, POS_BEFORE_FIRST, resultSetType, rowData, rowPtr, rowsInResult, statement, wasNull
-
-
Constructor Summary
Constructors Constructor Description MSCursorResultSet(JtdsStatement statement, java.lang.String sql, java.lang.String procName, ParamInfo[] procedureParams, int resultSetType, int concurrency)
Construct a cursor result set using Microsoft sp_cursorcreate etc.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
absolute(int row)
void
afterLast()
void
beforeFirst()
void
cancelRowUpdates()
void
close()
private void
cursor(java.lang.Integer opType, ParamInfo[] row)
Support general cursor operations such as delete, update etc.private void
cursorClose()
Close a server side cursor.private void
cursorCreate(java.lang.String sql, java.lang.String procName, ParamInfo[] parameters)
Create a new Cursor result set using the internal sp_cursoropen procedure.private boolean
cursorFetch(java.lang.Integer fetchType, int rowNum)
Fetch the next result row from a cursor using the internal sp_cursorfetch procedure.void
deleteRow()
boolean
first()
protected java.lang.Object
getColumn(int index)
Get the specified column's data item.protected java.lang.Object[]
getCurrentRow()
Retrieve the current row data.(package private) static int
getCursorConcurrencyOpt(int resultSetConcurrency)
Translates a JDBC result set concurrency into SQL Server native @ccOpt value for use with stored procedures such as sp_cursoropen, sp_cursorprepare or sp_cursorprepexec.(package private) static int
getCursorScrollOpt(int resultSetType, int resultSetConcurrency, boolean parameterized)
Translates a JDBC result set type into SQL Server native @scrollOpt value for use with stored procedures such as sp_cursoropen, sp_cursorprepare or sp_cursorprepexec.void
insertRow()
boolean
isLast()
boolean
last()
void
moveToCurrentRow()
void
moveToInsertRow()
boolean
next()
boolean
previous()
private void
processOutput(TdsCore tds, boolean setMeta)
Processes the output of a cursor open or fetch operation.void
refreshRow()
boolean
relative(int row)
boolean
rowDeleted()
boolean
rowInserted()
boolean
rowUpdated()
protected java.lang.Object
setColValue(int colIndex, int jdbcType, java.lang.Object value, int length)
Set the specified column's data value.void
updateRow()
-
Methods inherited from class net.sourceforge.jtds.jdbc.JtdsResultSet
cacheResultSetRows, checkOpen, checkScrollable, checkUpdateable, clearWarnings, copyInfo, copyRow, findColumn, getArray, getArray, getAsciiStream, getAsciiStream, getBigDecimal, getBigDecimal, getBigDecimal, getBigDecimal, getBinaryStream, getBinaryStream, getBlob, getBlob, getBoolean, getBoolean, getByte, getByte, getBytes, getBytes, getCharacterStream, getCharacterStream, getClob, getClob, getColumnCount, getColumns, getConcurrency, getCursorName, getDate, getDate, getDate, getDate, getDouble, getDouble, getFetchDirection, getFetchSize, getFloat, getFloat, getHoldability, getInt, getInt, getLong, getLong, getMetaData, getNCharacterStream, getNCharacterStream, getNClob, getNClob, getNString, getNString, getObject, getObject, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getRowId, getRowId, getShort, getShort, getSQLXML, getSQLXML, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, isAfterLast, isBeforeFirst, isClosed, isFirst, isWrapperFor, newRow, notImplemented, setColLabel, setColName, setColType, setColumnCount, setFetchDirection, setFetchSize, unwrap, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateClob, updateClob, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNString, updateNString, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRowId, updateRowId, updateShort, updateShort, updateSQLXML, updateSQLXML, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull
-
-
-
-
Field Detail
-
FETCH_FIRST
private static final java.lang.Integer FETCH_FIRST
-
FETCH_NEXT
private static final java.lang.Integer FETCH_NEXT
-
FETCH_PREVIOUS
private static final java.lang.Integer FETCH_PREVIOUS
-
FETCH_LAST
private static final java.lang.Integer FETCH_LAST
-
FETCH_ABSOLUTE
private static final java.lang.Integer FETCH_ABSOLUTE
-
FETCH_RELATIVE
private static final java.lang.Integer FETCH_RELATIVE
-
FETCH_REPEAT
private static final java.lang.Integer FETCH_REPEAT
-
FETCH_INFO
private static final java.lang.Integer FETCH_INFO
-
CURSOR_TYPE_KEYSET
private static final int CURSOR_TYPE_KEYSET
- See Also:
- Constant Field Values
-
CURSOR_TYPE_DYNAMIC
private static final int CURSOR_TYPE_DYNAMIC
- See Also:
- Constant Field Values
-
CURSOR_TYPE_FORWARD
private static final int CURSOR_TYPE_FORWARD
- See Also:
- Constant Field Values
-
CURSOR_TYPE_STATIC
private static final int CURSOR_TYPE_STATIC
- See Also:
- Constant Field Values
-
CURSOR_TYPE_FASTFORWARDONLY
private static final int CURSOR_TYPE_FASTFORWARDONLY
- See Also:
- Constant Field Values
-
CURSOR_TYPE_PARAMETERIZED
private static final int CURSOR_TYPE_PARAMETERIZED
- See Also:
- Constant Field Values
-
CURSOR_TYPE_AUTO_FETCH
private static final int CURSOR_TYPE_AUTO_FETCH
- See Also:
- Constant Field Values
-
CURSOR_CONCUR_READ_ONLY
private static final int CURSOR_CONCUR_READ_ONLY
- See Also:
- Constant Field Values
-
CURSOR_CONCUR_SCROLL_LOCKS
private static final int CURSOR_CONCUR_SCROLL_LOCKS
- See Also:
- Constant Field Values
-
CURSOR_CONCUR_OPTIMISTIC
private static final int CURSOR_CONCUR_OPTIMISTIC
- See Also:
- Constant Field Values
-
CURSOR_CONCUR_OPTIMISTIC_VALUES
private static final int CURSOR_CONCUR_OPTIMISTIC_VALUES
- See Also:
- Constant Field Values
-
CURSOR_OP_INSERT
private static final java.lang.Integer CURSOR_OP_INSERT
-
CURSOR_OP_UPDATE
private static final java.lang.Integer CURSOR_OP_UPDATE
-
CURSOR_OP_DELETE
private static final java.lang.Integer CURSOR_OP_DELETE
-
SQL_ROW_DIRTY
private static final java.lang.Integer SQL_ROW_DIRTY
The row is dirty and needs to be reloaded (internal state).
-
SQL_ROW_SUCCESS
private static final java.lang.Integer SQL_ROW_SUCCESS
The row is valid.
-
SQL_ROW_DELETED
private static final java.lang.Integer SQL_ROW_DELETED
The row has been deleted.
-
onInsertRow
private boolean onInsertRow
Set whenmoveToInsertRow()
was called.
-
insertRow
private ParamInfo[] insertRow
The "insert row".
-
updateRow
private ParamInfo[] updateRow
The "update row".
-
rowCache
private java.lang.Object[][] rowCache
The row cache used insteadJtdsResultSet.currentRow
.
-
cursorPos
private int cursorPos
Actual position of the cursor.
-
asyncCursor
private boolean asyncCursor
The cursor is being built asynchronously.
-
PARAM_CURSOR_HANDLE
private final ParamInfo PARAM_CURSOR_HANDLE
Cursor handle parameter.
-
PARAM_FETCHTYPE
private final ParamInfo PARAM_FETCHTYPE
sp_cursorfetch
fetchtype parameter.
-
PARAM_ROWNUM_IN
private final ParamInfo PARAM_ROWNUM_IN
sp_cursorfetch
rownum IN parameter (for actual fetches).
-
PARAM_NUMROWS_IN
private final ParamInfo PARAM_NUMROWS_IN
sp_cursorfetch
numrows IN parameter (for actual fetches).
-
PARAM_ROWNUM_OUT
private final ParamInfo PARAM_ROWNUM_OUT
sp_cursorfetch
rownum OUT parameter (for FETCH_INFO).
-
PARAM_NUMROWS_OUT
private final ParamInfo PARAM_NUMROWS_OUT
sp_cursorfetch
numrows OUT parameter (for FETCH_INFO).
-
PARAM_OPTYPE
private final ParamInfo PARAM_OPTYPE
sp_cursor
optype parameter.
-
PARAM_ROWNUM
private final ParamInfo PARAM_ROWNUM
sp_cursor
rownum parameter.
-
PARAM_TABLE
private final ParamInfo PARAM_TABLE
sp_cursor
table parameter.
-
-
Constructor Detail
-
MSCursorResultSet
MSCursorResultSet(JtdsStatement statement, java.lang.String sql, java.lang.String procName, ParamInfo[] procedureParams, int resultSetType, int concurrency) throws java.sql.SQLException
Construct a cursor result set using Microsoft sp_cursorcreate etc.- Parameters:
statement
- The parent statement object or null.resultSetType
- one of FORWARD_ONLY, SCROLL_INSENSITIVE, SCROLL_SENSITIVE.concurrency
- One of CONCUR_READ_ONLY, CONCUR_UPDATE.- Throws:
java.sql.SQLException
-
-
Method Detail
-
setColValue
protected java.lang.Object setColValue(int colIndex, int jdbcType, java.lang.Object value, int length) throws java.sql.SQLException
Set the specified column's data value.- Overrides:
setColValue
in classJtdsResultSet
- Parameters:
colIndex
- index of the columnvalue
- new column valuelength
- the length of a stream parameter- Returns:
- the value, possibly converted to an internal type
- Throws:
java.sql.SQLException
-
getColumn
protected java.lang.Object getColumn(int index) throws java.sql.SQLException
Get the specified column's data item.- Overrides:
getColumn
in classJtdsResultSet
- Parameters:
index
- the column index in the row- Returns:
- the column value as an
Object
- Throws:
java.sql.SQLException
- if the index is out of bounds or there is no current row
-
getCursorScrollOpt
static int getCursorScrollOpt(int resultSetType, int resultSetConcurrency, boolean parameterized)
Translates a JDBC result set type into SQL Server native @scrollOpt value for use with stored procedures such as sp_cursoropen, sp_cursorprepare or sp_cursorprepexec.- Parameters:
resultSetType
- JDBC result set type (one of theResultSet.TYPE_XXX
values)resultSetConcurrency
- JDBC result set concurrency (one of theResultSet.CONCUR_XXX
values)- Returns:
- a value for the @scrollOpt parameter
-
getCursorConcurrencyOpt
static int getCursorConcurrencyOpt(int resultSetConcurrency)
Translates a JDBC result set concurrency into SQL Server native @ccOpt value for use with stored procedures such as sp_cursoropen, sp_cursorprepare or sp_cursorprepexec.- Parameters:
resultSetConcurrency
- JDBC result set concurrency (one of theResultSet.CONCUR_XXX
values)- Returns:
- a value for the @scrollOpt parameter
-
cursorCreate
private void cursorCreate(java.lang.String sql, java.lang.String procName, ParamInfo[] parameters) throws java.sql.SQLException
Create a new Cursor result set using the internal sp_cursoropen procedure.- Parameters:
sql
- The SQL SELECT statement.procName
- Optional procedure name for cursors based on a stored procedure.parameters
- Optional stored procedure parameters.- Throws:
java.sql.SQLException
-
cursorFetch
private boolean cursorFetch(java.lang.Integer fetchType, int rowNum) throws java.sql.SQLException
Fetch the next result row from a cursor using the internal sp_cursorfetch procedure.- Parameters:
fetchType
- The type of fetch eg FETCH_ABSOLUTE.rowNum
- The row number to fetch.- Returns:
boolean
true if a result set row is returned.- Throws:
java.sql.SQLException
-
cursor
private void cursor(java.lang.Integer opType, ParamInfo[] row) throws java.sql.SQLException
Support general cursor operations such as delete, update etc.- Parameters:
opType
- the type of operation to performrow
- the row number to update- Throws:
java.sql.SQLException
-
cursorClose
private void cursorClose() throws java.sql.SQLException
Close a server side cursor.- Throws:
java.sql.SQLException
-
processOutput
private void processOutput(TdsCore tds, boolean setMeta) throws java.sql.SQLException
Processes the output of a cursor open or fetch operation. Fetches a batch of rows from theTdsCore
, loading them into the row cache and optionally sets the column meta data (if called on cursor open). Consumes all the response and checks for server returned errors.- Parameters:
tds
- theTdsCore
instancesetMeta
- whether column meta data needs to be loaded (cursor open)- Throws:
java.sql.SQLException
- if an error occurs or an error message is returned by the server
-
afterLast
public void afterLast() throws java.sql.SQLException
- Specified by:
afterLast
in interfacejava.sql.ResultSet
- Overrides:
afterLast
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
beforeFirst
public void beforeFirst() throws java.sql.SQLException
- Specified by:
beforeFirst
in interfacejava.sql.ResultSet
- Overrides:
beforeFirst
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
cancelRowUpdates
public void cancelRowUpdates() throws java.sql.SQLException
- Specified by:
cancelRowUpdates
in interfacejava.sql.ResultSet
- Overrides:
cancelRowUpdates
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
close
public void close() throws java.sql.SQLException
- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.sql.ResultSet
- Overrides:
close
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
deleteRow
public void deleteRow() throws java.sql.SQLException
- Specified by:
deleteRow
in interfacejava.sql.ResultSet
- Overrides:
deleteRow
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
insertRow
public void insertRow() throws java.sql.SQLException
- Specified by:
insertRow
in interfacejava.sql.ResultSet
- Overrides:
insertRow
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
moveToCurrentRow
public void moveToCurrentRow() throws java.sql.SQLException
- Specified by:
moveToCurrentRow
in interfacejava.sql.ResultSet
- Overrides:
moveToCurrentRow
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
moveToInsertRow
public void moveToInsertRow() throws java.sql.SQLException
- Specified by:
moveToInsertRow
in interfacejava.sql.ResultSet
- Overrides:
moveToInsertRow
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
refreshRow
public void refreshRow() throws java.sql.SQLException
- Specified by:
refreshRow
in interfacejava.sql.ResultSet
- Overrides:
refreshRow
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
updateRow
public void updateRow() throws java.sql.SQLException
- Specified by:
updateRow
in interfacejava.sql.ResultSet
- Overrides:
updateRow
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
first
public boolean first() throws java.sql.SQLException
- Specified by:
first
in interfacejava.sql.ResultSet
- Overrides:
first
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
isLast
public boolean isLast() throws java.sql.SQLException
- Specified by:
isLast
in interfacejava.sql.ResultSet
- Overrides:
isLast
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
last
public boolean last() throws java.sql.SQLException
- Specified by:
last
in interfacejava.sql.ResultSet
- Overrides:
last
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
next
public boolean next() throws java.sql.SQLException
- Specified by:
next
in interfacejava.sql.ResultSet
- Overrides:
next
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
previous
public boolean previous() throws java.sql.SQLException
- Specified by:
previous
in interfacejava.sql.ResultSet
- Overrides:
previous
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
rowDeleted
public boolean rowDeleted() throws java.sql.SQLException
- Specified by:
rowDeleted
in interfacejava.sql.ResultSet
- Overrides:
rowDeleted
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
rowInserted
public boolean rowInserted() throws java.sql.SQLException
- Specified by:
rowInserted
in interfacejava.sql.ResultSet
- Overrides:
rowInserted
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
rowUpdated
public boolean rowUpdated() throws java.sql.SQLException
- Specified by:
rowUpdated
in interfacejava.sql.ResultSet
- Overrides:
rowUpdated
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
absolute
public boolean absolute(int row) throws java.sql.SQLException
- Specified by:
absolute
in interfacejava.sql.ResultSet
- Overrides:
absolute
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
relative
public boolean relative(int row) throws java.sql.SQLException
- Specified by:
relative
in interfacejava.sql.ResultSet
- Overrides:
relative
in classJtdsResultSet
- Throws:
java.sql.SQLException
-
getCurrentRow
protected java.lang.Object[] getCurrentRow()
Description copied from class:JtdsResultSet
Retrieve the current row data.- Overrides:
getCurrentRow
in classJtdsResultSet
- Returns:
- The current row data as an
Object[]
.
-
-