?? preparedstatement.java
字號:
/*
Copyright (C) 2002 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.mysql.jdbc;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Array;
import java.sql.Clob;
import java.sql.ParameterMetaData;
import java.sql.Ref;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;
/**
* A SQL Statement is pre-compiled and stored in a PreparedStatement object.
* This object can then be used to efficiently execute this statement multiple
* times.
*
* <p>
* <B>Note:</B> The setXXX methods for setting IN parameter values must specify
* types that are compatible with the defined SQL type of the input parameter.
* For instance, if the IN parameter has SQL type Integer, then setInt should
* be used.
* </p>
*
* <p>
* If arbitrary parameter type conversions are required, then the setObject
* method should be used with a target SQL type.
* </p>
*
* @author Mark Matthews
* @version $Id: PreparedStatement.java,v 1.27.2.33 2004/02/05 15:56:17 mmatthew Exp $
*
* @see java.sql.ResultSet
* @see java.sql.PreparedStatement
*/
public class PreparedStatement extends com.mysql.jdbc.Statement
implements java.sql.PreparedStatement {
private java.sql.DatabaseMetaData dbmd = null;
private ParseInfo parseInfo;
private java.sql.ResultSetMetaData pstmtResultMetaData;
private SimpleDateFormat tsdf = null;
private String originalSql = null;
private boolean[] isNull = null;
private boolean[] isStream = null;
private InputStream[] parameterStreams = null;
private byte[][] parameterValues = null;
private byte[][] staticSqlStrings = null;
private byte[] streamConvertBuf = new byte[4096];
private int[] streamLengths = null;
private boolean hasLimitClause = false;
private boolean isLoadDataQuery = false;
private boolean retrieveGeneratedKeys = false;
private boolean useTrueBoolean = false;
private char firstCharOfStmt = 0;
/**
* Constructor for the PreparedStatement class.
*
* @param conn the connection creating this statement
* @param sql the SQL for this statement
* @param catalog the catalog/database this statement should be issued
* against
*
* @throws SQLException if a database error occurs.
*/
public PreparedStatement(Connection conn, String sql, String catalog)
throws SQLException {
super(conn, catalog);
if (sql == null) {
throw new SQLException("SQL String can not be NULL", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
}
originalSql = sql;
this.dbmd = this.connection.getMetaData();
useTrueBoolean = connection.getIO().versionMeetsMinimum(3, 21, 23);
this.parseInfo = new ParseInfo(sql, this.connection, this.dbmd,
this.charEncoding, this.charConverter);
initializeFromParseInfo();
}
/**
* Creates a new PreparedStatement object.
*
* @param conn the connection creating this statement
* @param sql the SQL for this statement
* @param catalog the catalog/database this statement should be issued
* against
* @param cachedParseInfo already created parseInfo.
*
* @throws SQLException DOCUMENT ME!
*/
public PreparedStatement(Connection conn, String sql, String catalog,
ParseInfo cachedParseInfo) throws SQLException {
super(conn, catalog);
if (sql == null) {
throw new SQLException("SQL String can not be NULL", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
}
originalSql = sql;
this.dbmd = this.connection.getMetaData();
useTrueBoolean = connection.getIO().versionMeetsMinimum(3, 21, 23);
this.parseInfo = cachedParseInfo;
initializeFromParseInfo();
}
/**
* JDBC 2.0 Set an Array parameter.
*
* @param i the first parameter is 1, the second is 2, ...
* @param x an object representing an SQL array
*
* @throws SQLException because this method is not implemented.
* @throws NotImplemented DOCUMENT ME!
*/
public void setArray(int i, Array x) throws SQLException {
throw new NotImplemented();
}
/**
* When a very large ASCII 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 ASCII 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 in the stream
*
* @exception SQLException if a database access error occurs
*/
public synchronized void setAsciiStream(int parameterIndex, InputStream x,
int length) throws SQLException {
if (x == null) {
setNull(parameterIndex, java.sql.Types.VARCHAR);
} else {
setBinaryStream(parameterIndex, x, length);
}
}
/**
* Set a parameter to a java.math.BigDecimal value. The driver converts
* this to a SQL NUMERIC value when it sends it to the database.
*
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*
* @exception SQLException if a database access error occurs
*/
public void setBigDecimal(int parameterIndex, BigDecimal x)
throws SQLException {
if (x == null) {
setNull(parameterIndex, java.sql.Types.DECIMAL);
} else {
setInternal(parameterIndex, fixDecimalExponent(x.toString()));
}
}
/**
* When a very large binary value is input to a LONGVARBINARY 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.
*
* <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 (ignored)
*
* @throws SQLException if a database access error occurs
* @throws java.sql.SQLException DOCUMENT ME!
*/
public void setBinaryStream(int parameterIndex, InputStream x, int length)
throws SQLException {
if (x == null) {
setNull(parameterIndex, java.sql.Types.BINARY);
} else {
if ((parameterIndex < 1)
|| (parameterIndex > staticSqlStrings.length)) {
throw new java.sql.SQLException(
"Parameter index out of range (" + parameterIndex + " > "
+ staticSqlStrings.length + ")", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
}
parameterStreams[parameterIndex - 1] = x;
isStream[parameterIndex - 1] = true;
streamLengths[parameterIndex - 1] = length;
isNull[parameterIndex - 1] = false;
}
}
/**
* JDBC 2.0 Set a BLOB parameter.
*
* @param i the first parameter is 1, the second is 2, ...
* @param x an object representing a BLOB
*
* @throws SQLException if a database error occurs
*/
public void setBlob(int i, java.sql.Blob x) throws SQLException {
setBinaryStream(i, x.getBinaryStream(), (int) x.length());
}
/**
* Set a parameter to a Java boolean value. The driver converts this to a
* SQL BIT 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 setBoolean(int parameterIndex, boolean x)
throws SQLException {
if (useTrueBoolean) {
setInternal(parameterIndex, x ? "'1'" : "'0'");
} else {
setInternal(parameterIndex, x ? "'t'" : "'f'");
}
}
/**
* Set a parameter to a Java byte value. The driver converts this to a SQL
* TINYINT value when it sends it to the database.
*
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*
* @exception SQLException if a database access error occurs
*/
public void setByte(int parameterIndex, byte x) throws SQLException {
setInternal(parameterIndex, String.valueOf(x));
}
/**
* Set a parameter to a Java array of bytes. The driver converts this to a
* SQL VARBINARY or LONGVARBINARY (depending on the argument's size
* relative to the driver's limits on VARBINARYs) when it sends it to the
* database.
*
* @param parameterIndex the first parameter is 1...
* @param x the parameter value
*
* @exception SQLException if a database access error occurs
*/
public void setBytes(int parameterIndex, byte[] x)
throws SQLException {
if (x == null) {
setNull(parameterIndex, java.sql.Types.BINARY);
} else {
// escape them
int numBytes = x.length;
ByteArrayOutputStream bOut = new ByteArrayOutputStream(numBytes);
bOut.write('\'');
for (int i = 0; i < numBytes; ++i) {
byte b = x[i];
switch (b) {
case 0: /* Must be escaped for 'mysql' */
bOut.write('\\');
bOut.write('0');
break;
case '\n': /* Must be escaped for logs */
bOut.write('\\');
bOut.write('n');
break;
case '\r':
bOut.write('\\');
bOut.write('r');
break;
case '\\':
bOut.write('\\');
bOut.write('\\');
break;
case '\'':
bOut.write('\\');
bOut.write('\'');
break;
case '"': /* Better safe than sorry */
bOut.write('\\');
bOut.write('"');
break;
case '\032': /* This gives problems on Win32 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -