📄 preparedstatement.java
字号:
buf.append('r'); break; case '\\': buf.append('\\'); buf.append('\\'); break; case '\'': buf.append('\\'); buf.append('\''); break; case '"': /* Better safe than sorry */ buf.append('\\'); buf.append('"'); break; case '\032': /* This gives problems on Win32 */ buf.append('\\'); buf.append('Z'); break; default: buf.append(c); } } buf.append('\''); String parameterAsString = buf.toString(); try { byte[] parameterAsBytes = null; if (!this.isLoadDataQuery) { parameterAsBytes = StringUtils.getBytes(parameterAsString, this.charConverter, this.charEncoding, this.connection.getServerCharacterEncoding(), this.connection.parserKnowsUnicode()); } else { // Send with platform character encoding parameterAsBytes = parameterAsString.getBytes(); } setInternal(parameterIndex, parameterAsBytes); } catch (UnsupportedEncodingException uue) { throw new SQLException("Unsupported character encoding '" + this.charEncoding + "'", SQLError.SQL_STATE_ILLEGAL_ARGUMENT); } } } /** * Set a parameter to a java.sql.Time value. The driver converts this to a * SQL TIME value when it sends it to the database. * * @param parameterIndex the first parameter is 1...)); * @param x the parameter value * * @throws SQLException if a database access error occurs */ public void setTime(int parameterIndex, Time x) throws SQLException { setTimeInternal(parameterIndex, x, this.connection.getDefaultTimeZone()); } /** * Set a parameter to a java.sql.Time value. The driver converts this to a * SQL TIME value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the cal specifying the timezone * * @throws SQLException if a database-access error occurs. */ public void setTime(int parameterIndex, java.sql.Time x, Calendar cal) throws SQLException { setTimeInternal(parameterIndex, x, cal.getTimeZone()); } /** * Set a parameter to a java.sql.Timestamp value. The driver converts this * to a SQL TIMESTAMP value when it sends it to the database. * * @param parameterIndex the first parameter is 1... * @param x the parameter value * * @throws SQLException if a database access error occurs */ public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { setTimestampInternal(parameterIndex, x, this.connection.getDefaultTimeZone()); } /** * Set a parameter to a java.sql.Timestamp value. The driver converts this * to a SQL TIMESTAMP value when it sends it to the database. * * @param parameterIndex the first parameter is 1, the second is 2, ... * @param x the parameter value * @param cal the calendar specifying the timezone to use * * @throws SQLException if a database-access error occurs. */ public void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal) throws SQLException { setTimestampInternal(parameterIndex, x, cal.getTimeZone()); } /** * @see PreparedStatement#setURL(int, URL) */ public void setURL(int parameterIndex, URL arg) throws SQLException { if (arg != null) { setString(parameterIndex, arg.toString()); } else { setNull(parameterIndex, Types.CHAR); } } /** * When a very large Unicode value is input to a LONGVARCHAR parameter, it * may be more practical to send it via a java.io.InputStream. JDBC will * read the data from the stream as needed, until it reaches end-of-file. * The JDBC driver will do any necessary conversion from UNICODE to the * database char format. * * <P> * <B>Note:</B> This stream object can either be a standard Java stream * object or your own subclass that implements the standard interface. * </p> * * @param parameterIndex the first parameter is 1... * @param x the parameter value * @param length the number of bytes to read from the stream * * @throws SQLException if a database access error occurs * * @deprecated */ public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { if (x == null) { setNull(parameterIndex, java.sql.Types.VARCHAR); } else { setBinaryStream(parameterIndex, x, length); } } /** * JDBC 2.0 Add a set of parameters to the batch. * * @throws SQLException if a database-access error occurs. * * @see Statement#addBatch */ public void addBatch() throws SQLException { if (batchedArgs == null) { batchedArgs = new ArrayList(); } batchedArgs.add(new BatchParams(parameterValues, parameterStreams, isStream, streamLengths, isNull)); } /** * In general, parameter values remain in force for repeated used of a * Statement. Setting a parameter value automatically clears its previous * value. However, in some cases, it is useful to immediately release the * resources used by the current parameter values; this can be done by * calling clearParameters * * @throws SQLException if a database access error occurs */ public void clearParameters() throws SQLException { for (int i = 0; i < parameterValues.length; i++) { parameterValues[i] = null; parameterStreams[i] = null; isStream[i] = false; isNull[i] = false; } } /** * Closes this prepared statement and releases all resources. * * @throws SQLException if database error occurs. */ public void close() throws SQLException { super.close(); this.parseInfo = null; this.dbmd = null; this.originalSql = null; this.staticSqlStrings = null; this.parameterValues = null; this.parameterStreams = null; this.isStream = null; this.streamLengths = null; this.isNull = null; this.streamConvertBuf = null; } /** * Some prepared statements return multiple results; the execute method * handles these complex statements as well as the simpler form of * statements handled by executeQuery and executeUpdate * * @return true if the next result is a ResultSet; false if it is an update * count or there are no more results * * @throws SQLException if a database error occurs. */ public boolean execute() throws SQLException { if (connection.isReadOnly() && (firstCharOfStmt != 'S')) { throw new SQLException("Connection is read-only. " + "Queries leading to data modification are not allowed", SQLError.SQL_STATE_ILLEGAL_ARGUMENT); } checkClosed(); ResultSet rs = null; synchronized (connection.getMutex()) { this.batchedGeneratedKeys = null; Buffer sendPacket = fillSendPacket(); String oldCatalog = null; if (!this.connection.getCatalog().equals(currentCatalog)) { oldCatalog = this.connection.getCatalog(); this.connection.setCatalog(currentCatalog); } boolean oldInfoMsgState = false; if (this.retrieveGeneratedKeys) { oldInfoMsgState = this.connection.isReadInfoMsgEnabled(); this.connection.setReadInfoMsgEnabled(true); } // If there isn't a limit clause in the SQL // then limit the number of rows to return in // an efficient manner. Only do this if // setMaxRows() hasn't been used on any Statements // generated from the current Connection (saves // a query, and network traffic). // // Only apply max_rows to selects // if (this.connection.useMaxRows()) { if (firstCharOfStmt == 'S') { if (hasLimitClause) { rs = this.connection.execSQL((String) null, maxRows, sendPacket, resultSetConcurrency, createStreamingResultSet(), true, this.currentCatalog); } else { if (maxRows <= 0) { this.connection.execSQL("SET OPTION SQL_SELECT_LIMIT=DEFAULT", -1, this.currentCatalog); } else { this.connection.execSQL( "SET OPTION SQL_SELECT_LIMIT=" + maxRows, -1, this.currentCatalog); } } } else { this.connection.execSQL("SET OPTION SQL_SELECT_LIMIT=DEFAULT", -1, this.currentCatalog); } // Finally, execute the query rs = this.connection.execSQL(null, -1, sendPacket, resultSetConcurrency, createStreamingResultSet(), (firstCharOfStmt == 'S'), this.currentCatalog); } else { rs = this.connection.execSQL(null, -1, sendPacket, resultSetConcurrency, createStreamingResultSet(), (firstCharOfStmt == 'S'), this.currentCatalog); } if (this.retrieveGeneratedKeys) { this.connection.setReadInfoMsgEnabled(oldInfoMsgState); } if (oldCatalog != null) { this.connection.setCatalog(oldCatalog); } lastInsertId = rs.getUpdateID(); if (rs != null) { rs.setFirstCharOfQuery(this.firstCharOfStmt); rs.setConnection(connection); rs.setResultSetType(resultSetType); rs.setResultSetConcurrency(resultSetConcurrency); rs.setStatement(this); this.results = rs; } return ((rs != null) && rs.reallyResult()); } } /** * JDBC 2.0 Submit a batch of commands to the database for execution. This * method is optional. * * @return an array of update counts containing one element for each * command in the batch. The array is ordered according to the * order in which commands were inserted into the batch * * @throws SQLException if a database-access error occurs, or the driver * does not support batch statements * @throws java.sql.BatchUpdateException DOCUMENT ME! */ public int[] executeBatch() throws SQLException { if (connection.isReadOnly()) { throw new SQLException("Connection is read-only. " + "Queries leading to data modification are not allowed", SQLError.SQL_STATE_ILLEGAL_ARGUMENT); } try { int[] updateCounts = null; if (batchedArgs != null) { int nbrCommands = batchedArgs.size(); updateCounts = new int[nbrCommands]; for (int i = 0; i < nbrCommands; i++) { updateCounts[i] = -3; } SQLException sqlEx = null; int commandIndex = 0; if (this.retrieveGeneratedKeys) { this.batchedGeneratedKeys = new ArrayList(nbrCommands); } for (commandIndex = 0; commandIndex < nbrCommands; commandIndex++) { Object arg = batchedArgs.get(commandIndex); if (arg instanceof String) { updateCounts[commandIndex] = executeUpdate((String) arg); } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -