Class JtdsPreparedStatement

  • All Implemented Interfaces:
    java.lang.AutoCloseable, java.sql.PreparedStatement, java.sql.Statement, java.sql.Wrapper
    Direct Known Subclasses:
    JtdsCallableStatement

    public class JtdsPreparedStatement
    extends JtdsStatement
    implements java.sql.PreparedStatement
    jTDS implementation of the java.sql.PreparedStatement interface.

    Implementation notes:

    1. Generally a simple subclass of Statement mainly adding support for the setting of parameters.
    2. The stream logic is taken over from the work Brian did to add Blob support to the original jTDS.
    3. Use of Statement specific method calls eg executeQuery(sql) is blocked by this version of the driver. This is unlike the original jTDS but inline with all the other JDBC drivers that I have been able to test.
    Author:
    Brian Heineman, Mike Hutchinson, Holger Rehn
    • Field Detail

      • sql

        protected final java.lang.String sql
        The SQL statement being prepared.
      • originalSql

        private final java.lang.String originalSql
        The original SQL statement provided at construction time.
      • sqlWord

        protected java.lang.String sqlWord
        The first SQL keyword in the SQL string.
      • procName

        protected java.lang.String procName
        The procedure name for CallableStatements.
      • parameters

        protected ParamInfo[] parameters
        The parameter list for the call.
      • returnKeys

        private boolean returnKeys
        True to return generated keys.
      • paramMetaData

        protected ParamInfo[] paramMetaData
        The cached parameter meta data.
      • f

        private static final java.text.NumberFormat f
        Used to format numeric values when scale is specified.
      • handles

        java.util.Collection handles
        Collection of handles used by this statement
    • Constructor Detail

      • JtdsPreparedStatement

        JtdsPreparedStatement​(JtdsConnection connection,
                              java.lang.String sql,
                              int resultSetType,
                              int concurrency,
                              boolean returnKeys)
                       throws java.sql.SQLException
        Construct a new preparedStatement object.
        Parameters:
        connection - The parent connection.
        sql - The SQL statement to prepare.
        resultSetType - The result set type eg SCROLLABLE etc.
        concurrency - The result set concurrency eg READONLY.
        returnKeys - True if generated keys should be returned.
        Throws:
        java.sql.SQLException
    • Method Detail

      • toString

        public java.lang.String toString()
        Returns the SQL command provided at construction time.
        Overrides:
        toString in class java.lang.Object
      • normalizeCall

        protected static java.lang.String normalizeCall​(java.lang.String sql)
                                                 throws java.sql.SQLException

        This method converts native call syntax into (hopefully) valid JDBC escape syntax.

        Note: This method is required for backwards compatibility with previous versions of jTDS. Strictly speaking only the JDBC syntax needs to be recognized, constructions such as "?=#testproc ?,?" are neither valid native syntax nor valid escapes. All the substrings and trims below are not as bad as they look. The objects created all refer back to the original SQL string it is just the start and length positions which change.

        Parameters:
        sql - the SQL statement to process
        Returns:
        the SQL, possibly in original form
        Throws:
        java.sql.SQLException - if the SQL statement is detected to be a normal SQL INSERT, UPDATE or DELETE statement instead of a procedure call
      • normalize

        private static java.lang.String normalize​(java.lang.String sql,
                                                  int level)
                                           throws java.sql.SQLException

        This method converts native call syntax into (hopefully) valid JDBC escape syntax.

        Note: This method is required for backwards compatibility with previous versions of jTDS. Strictly speaking only the JDBC syntax needs to be recognized, constructions such as "?=#testproc ?,?" are neither valid native syntax nor valid escapes. All the substrings and trims below are not as bad as they look. The objects created all refer back to the original SQL string it is just the start and length positions which change.

        Parameters:
        sql - the SQL statement to process
        Returns:
        the SQL, possibly in original form
        Throws:
        java.sql.SQLException - if the SQL statement is detected to be a normal SQL INSERT, UPDATE or DELETE statement instead of a procedure call
      • openComment

        private static boolean openComment​(java.lang.String sql,
                                           int offset)
                                    throws java.sql.SQLException
        Throws:
        java.sql.SQLException
      • checkOpen

        protected void checkOpen()
                          throws java.sql.SQLException
        Check that this statement is still open.
        Overrides:
        checkOpen in class JtdsStatement
        Throws:
        java.sql.SQLException - if statement closed.
      • notSupported

        protected void notSupported​(java.lang.String method)
                             throws java.sql.SQLException
        Report that user tried to call a method not supported on this type of statement.
        Parameters:
        method - The method name to report in the error message.
        Throws:
        java.sql.SQLException
      • executeMSBatch

        protected java.sql.SQLException executeMSBatch​(int size,
                                                       int executeSize,
                                                       java.util.ArrayList counts)
                                                throws java.sql.SQLException
        Execute the SQL batch on a MS server.

        When running with prepareSQL=1 or 3, the driver will first prepare temporary stored procedures or statements for each parameter combination found in the batch. The handles to these pre-preared statements will then be used to execute the actual batch statements.

        Overrides:
        executeMSBatch in class JtdsStatement
        Parameters:
        size - the total size of the batch
        executeSize - the maximum number of statements to send in one request
        counts - the returned update counts
        Returns:
        chained exceptions linked to a SQLException
        Throws:
        java.sql.SQLException - if a serious error occurs during execution
      • executeSybaseBatch

        protected java.sql.SQLException executeSybaseBatch​(int size,
                                                           int executeSize,
                                                           java.util.ArrayList counts)
                                                    throws java.sql.SQLException
        Execute the SQL batch on a Sybase server.

        Sybase needs to have the SQL concatenated into one TDS language packet followed by up to 1000 parameters. This method will be overridden for CallableStatements.

        Overrides:
        executeSybaseBatch in class JtdsStatement
        Parameters:
        size - the total size of the batch
        executeSize - the maximum number of statements to send in one request
        counts - the returned update counts
        Returns:
        chained exceptions linked to a SQLException
        Throws:
        java.sql.SQLException - if a serious error occurs during execution
      • getParameter

        protected ParamInfo getParameter​(int parameterIndex)
                                  throws java.sql.SQLException
        Check the supplied index and return the selected parameter.
        Parameters:
        parameterIndex - the parameter index 1 to n.
        Returns:
        the parameter as a ParamInfo object.
        Throws:
        java.sql.SQLException - if the statement is closed; if parameterIndex is less than 0; if parameterIndex is greater than the number of parameters; if checkIfSet was true and the parameter was not set
      • setObjectBase

        public void setObjectBase​(int parameterIndex,
                                  java.lang.Object x,
                                  int targetSqlType,
                                  int scale)
                           throws java.sql.SQLException
        Generic setObject method.
        Parameters:
        parameterIndex - Parameter index 1 to n.
        x - The value to set.
        targetSqlType - The java.sql.Types constant describing the data.
        scale - The decimal scale -1 if not set.
        Throws:
        java.sql.SQLException
      • setParameter

        protected void setParameter​(int parameterIndex,
                                    java.lang.Object x,
                                    int targetSqlType,
                                    int scale,
                                    int length)
                             throws java.sql.SQLException
        Update the ParamInfo object for the specified parameter.
        Parameters:
        parameterIndex - Parameter index 1 to n.
        x - The value to set.
        targetSqlType - The java.sql.Types constant describing the data.
        scale - The decimal scale -1 if not set.
        length - The length of the data item.
        Throws:
        java.sql.SQLException
      • setColMetaData

        void setColMetaData​(ColInfo[] value)
        Update the cached column meta data information.
        Parameters:
        value - The Column meta data array.
      • setParamMetaData

        void setParamMetaData​(ParamInfo[] value)
        Update the cached parameter meta data information.
        Parameters:
        value - The Column meta data array.
      • close

        public void close()
                   throws java.sql.SQLException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.sql.Statement
        Overrides:
        close in class JtdsStatement
        Throws:
        java.sql.SQLException
      • executeUpdate

        public int executeUpdate()
                          throws java.sql.SQLException
        Specified by:
        executeUpdate in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • addBatch

        public void addBatch()
                      throws java.sql.SQLException
        Specified by:
        addBatch in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • clearParameters

        public void clearParameters()
                             throws java.sql.SQLException
        Specified by:
        clearParameters in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • execute

        public boolean execute()
                        throws java.sql.SQLException
        Specified by:
        execute in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setByte

        public void setByte​(int parameterIndex,
                            byte x)
                     throws java.sql.SQLException
        Specified by:
        setByte in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setDouble

        public void setDouble​(int parameterIndex,
                              double x)
                       throws java.sql.SQLException
        Specified by:
        setDouble in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setFloat

        public void setFloat​(int parameterIndex,
                             float x)
                      throws java.sql.SQLException
        Specified by:
        setFloat in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setInt

        public void setInt​(int parameterIndex,
                           int x)
                    throws java.sql.SQLException
        Specified by:
        setInt in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNull

        public void setNull​(int parameterIndex,
                            int sqlType)
                     throws java.sql.SQLException
        Specified by:
        setNull in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setLong

        public void setLong​(int parameterIndex,
                            long x)
                     throws java.sql.SQLException
        Specified by:
        setLong in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setShort

        public void setShort​(int parameterIndex,
                             short x)
                      throws java.sql.SQLException
        Specified by:
        setShort in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBoolean

        public void setBoolean​(int parameterIndex,
                               boolean x)
                        throws java.sql.SQLException
        Specified by:
        setBoolean in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBytes

        public void setBytes​(int parameterIndex,
                             byte[] x)
                      throws java.sql.SQLException
        Specified by:
        setBytes in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setAsciiStream

        public void setAsciiStream​(int parameterIndex,
                                   java.io.InputStream inputStream,
                                   int length)
                            throws java.sql.SQLException
        Specified by:
        setAsciiStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBinaryStream

        public void setBinaryStream​(int parameterIndex,
                                    java.io.InputStream x,
                                    int length)
                             throws java.sql.SQLException
        Specified by:
        setBinaryStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setUnicodeStream

        public void setUnicodeStream​(int parameterIndex,
                                     java.io.InputStream inputStream,
                                     int length)
                              throws java.sql.SQLException
        Specified by:
        setUnicodeStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setCharacterStream

        public void setCharacterStream​(int parameterIndex,
                                       java.io.Reader reader,
                                       int length)
                                throws java.sql.SQLException
        Specified by:
        setCharacterStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setObject

        public void setObject​(int parameterIndex,
                              java.lang.Object x)
                       throws java.sql.SQLException
        Specified by:
        setObject in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setObject

        public void setObject​(int parameterIndex,
                              java.lang.Object x,
                              int targetSqlType)
                       throws java.sql.SQLException
        Specified by:
        setObject in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setObject

        public void setObject​(int parameterIndex,
                              java.lang.Object x,
                              int targetSqlType,
                              int scale)
                       throws java.sql.SQLException
        Specified by:
        setObject in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNull

        public void setNull​(int parameterIndex,
                            int sqlType,
                            java.lang.String typeName)
                     throws java.sql.SQLException
        Specified by:
        setNull in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setString

        public void setString​(int parameterIndex,
                              java.lang.String x)
                       throws java.sql.SQLException
        Specified by:
        setString in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBigDecimal

        public void setBigDecimal​(int parameterIndex,
                                  java.math.BigDecimal x)
                           throws java.sql.SQLException
        Specified by:
        setBigDecimal in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setURL

        public void setURL​(int parameterIndex,
                           java.net.URL url)
                    throws java.sql.SQLException
        Specified by:
        setURL in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setArray

        public void setArray​(int arg0,
                             java.sql.Array arg1)
                      throws java.sql.SQLException
        Specified by:
        setArray in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBlob

        public void setBlob​(int parameterIndex,
                            java.sql.Blob x)
                     throws java.sql.SQLException
        Specified by:
        setBlob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setClob

        public void setClob​(int parameterIndex,
                            java.sql.Clob x)
                     throws java.sql.SQLException
        Specified by:
        setClob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setDate

        public void setDate​(int parameterIndex,
                            java.sql.Date x)
                     throws java.sql.SQLException
        Specified by:
        setDate in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • getParameterMetaData

        public java.sql.ParameterMetaData getParameterMetaData()
                                                        throws java.sql.SQLException
        Specified by:
        getParameterMetaData in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setRef

        public void setRef​(int parameterIndex,
                           java.sql.Ref x)
                    throws java.sql.SQLException
        Specified by:
        setRef in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • executeQuery

        public java.sql.ResultSet executeQuery()
                                        throws java.sql.SQLException
        Specified by:
        executeQuery in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • getMetaData

        public java.sql.ResultSetMetaData getMetaData()
                                               throws java.sql.SQLException
        Specified by:
        getMetaData in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setTime

        public void setTime​(int parameterIndex,
                            java.sql.Time x)
                     throws java.sql.SQLException
        Specified by:
        setTime in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setTimestamp

        public void setTimestamp​(int parameterIndex,
                                 java.sql.Timestamp x)
                          throws java.sql.SQLException
        Specified by:
        setTimestamp in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setDate

        public void setDate​(int parameterIndex,
                            java.sql.Date x,
                            java.util.Calendar cal)
                     throws java.sql.SQLException
        Specified by:
        setDate in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setTime

        public void setTime​(int parameterIndex,
                            java.sql.Time x,
                            java.util.Calendar cal)
                     throws java.sql.SQLException
        Specified by:
        setTime in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setTimestamp

        public void setTimestamp​(int parameterIndex,
                                 java.sql.Timestamp x,
                                 java.util.Calendar cal)
                          throws java.sql.SQLException
        Specified by:
        setTimestamp in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • executeUpdate

        public int executeUpdate​(java.lang.String sql)
                          throws java.sql.SQLException
        Specified by:
        executeUpdate in interface java.sql.Statement
        Overrides:
        executeUpdate in class JtdsStatement
        Throws:
        java.sql.SQLException
      • addBatch

        public void addBatch​(java.lang.String sql)
                      throws java.sql.SQLException
        Specified by:
        addBatch in interface java.sql.Statement
        Overrides:
        addBatch in class JtdsStatement
        Throws:
        java.sql.SQLException
      • execute

        public boolean execute​(java.lang.String sql)
                        throws java.sql.SQLException
        Specified by:
        execute in interface java.sql.Statement
        Overrides:
        execute in class JtdsStatement
        Throws:
        java.sql.SQLException
      • executeUpdate

        public int executeUpdate​(java.lang.String sql,
                                 int getKeys)
                          throws java.sql.SQLException
        Specified by:
        executeUpdate in interface java.sql.Statement
        Overrides:
        executeUpdate in class JtdsStatement
        Throws:
        java.sql.SQLException
      • execute

        public boolean execute​(java.lang.String arg0,
                               int arg1)
                        throws java.sql.SQLException
        Specified by:
        execute in interface java.sql.Statement
        Overrides:
        execute in class JtdsStatement
        Throws:
        java.sql.SQLException
      • executeUpdate

        public int executeUpdate​(java.lang.String arg0,
                                 int[] arg1)
                          throws java.sql.SQLException
        Specified by:
        executeUpdate in interface java.sql.Statement
        Overrides:
        executeUpdate in class JtdsStatement
        Throws:
        java.sql.SQLException
      • execute

        public boolean execute​(java.lang.String arg0,
                               int[] arg1)
                        throws java.sql.SQLException
        Specified by:
        execute in interface java.sql.Statement
        Overrides:
        execute in class JtdsStatement
        Throws:
        java.sql.SQLException
      • executeUpdate

        public int executeUpdate​(java.lang.String arg0,
                                 java.lang.String[] arg1)
                          throws java.sql.SQLException
        Specified by:
        executeUpdate in interface java.sql.Statement
        Overrides:
        executeUpdate in class JtdsStatement
        Throws:
        java.sql.SQLException
      • execute

        public boolean execute​(java.lang.String arg0,
                               java.lang.String[] arg1)
                        throws java.sql.SQLException
        Specified by:
        execute in interface java.sql.Statement
        Overrides:
        execute in class JtdsStatement
        Throws:
        java.sql.SQLException
      • executeQuery

        public java.sql.ResultSet executeQuery​(java.lang.String sql)
                                        throws java.sql.SQLException
        Specified by:
        executeQuery in interface java.sql.Statement
        Overrides:
        executeQuery in class JtdsStatement
        Throws:
        java.sql.SQLException
      • setAsciiStream

        public void setAsciiStream​(int parameterIndex,
                                   java.io.InputStream x)
                            throws java.sql.SQLException
        Specified by:
        setAsciiStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setAsciiStream

        public void setAsciiStream​(int parameterIndex,
                                   java.io.InputStream x,
                                   long length)
                            throws java.sql.SQLException
        Specified by:
        setAsciiStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBinaryStream

        public void setBinaryStream​(int parameterIndex,
                                    java.io.InputStream x)
                             throws java.sql.SQLException
        Specified by:
        setBinaryStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBinaryStream

        public void setBinaryStream​(int parameterIndex,
                                    java.io.InputStream x,
                                    long length)
                             throws java.sql.SQLException
        Specified by:
        setBinaryStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBlob

        public void setBlob​(int parameterIndex,
                            java.io.InputStream inputStream)
                     throws java.sql.SQLException
        Specified by:
        setBlob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setBlob

        public void setBlob​(int parameterIndex,
                            java.io.InputStream inputStream,
                            long length)
                     throws java.sql.SQLException
        Specified by:
        setBlob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setCharacterStream

        public void setCharacterStream​(int parameterIndex,
                                       java.io.Reader reader)
                                throws java.sql.SQLException
        Specified by:
        setCharacterStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setCharacterStream

        public void setCharacterStream​(int parameterIndex,
                                       java.io.Reader reader,
                                       long length)
                                throws java.sql.SQLException
        Specified by:
        setCharacterStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setClob

        public void setClob​(int parameterIndex,
                            java.io.Reader reader)
                     throws java.sql.SQLException
        Specified by:
        setClob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setClob

        public void setClob​(int parameterIndex,
                            java.io.Reader reader,
                            long length)
                     throws java.sql.SQLException
        Specified by:
        setClob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNCharacterStream

        public void setNCharacterStream​(int parameterIndex,
                                        java.io.Reader value)
                                 throws java.sql.SQLException
        Specified by:
        setNCharacterStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNCharacterStream

        public void setNCharacterStream​(int parameterIndex,
                                        java.io.Reader value,
                                        long length)
                                 throws java.sql.SQLException
        Specified by:
        setNCharacterStream in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNClob

        public void setNClob​(int parameterIndex,
                             java.sql.NClob value)
                      throws java.sql.SQLException
        Specified by:
        setNClob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNClob

        public void setNClob​(int parameterIndex,
                             java.io.Reader reader)
                      throws java.sql.SQLException
        Specified by:
        setNClob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNClob

        public void setNClob​(int parameterIndex,
                             java.io.Reader reader,
                             long length)
                      throws java.sql.SQLException
        Specified by:
        setNClob in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setNString

        public void setNString​(int parameterIndex,
                               java.lang.String value)
                        throws java.sql.SQLException
        Specified by:
        setNString in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setRowId

        public void setRowId​(int parameterIndex,
                             java.sql.RowId x)
                      throws java.sql.SQLException
        Specified by:
        setRowId in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException
      • setSQLXML

        public void setSQLXML​(int parameterIndex,
                              java.sql.SQLXML xmlObject)
                       throws java.sql.SQLException
        Specified by:
        setSQLXML in interface java.sql.PreparedStatement
        Throws:
        java.sql.SQLException