📄 jtdspreparedstatement.java
字号:
tds.executeSQL(sqlBuf.toString(), null, args, false, 0, -1, -1, true);
sqlBuf.setLength(0);
paramList.clear();
// If the batch has been sent, process the results
sqlEx = tds.getBatchCounts(counts, sqlEx);
// If a serious error or a server error then we stop
// execution now as count is too small.
if (sqlEx != null && counts.size() != i) {
break;
}
}
}
return sqlEx;
}
/**
* Check the supplied index and return the selected parameter.
*
* @param parameterIndex the parameter index 1 to n.
* @return the parameter as a <code>ParamInfo</code> object.
* @throws SQLException if the statement is closed;
* if <code>parameterIndex</code> is less than 0;
* if <code>parameterIndex</code> is greater than the
* number of parameters;
* if <code>checkIfSet</code> was <code>true</code>
* and the parameter was not set
*/
protected ParamInfo getParameter(int parameterIndex) throws SQLException {
checkOpen();
if (parameterIndex < 1 || parameterIndex > parameters.length) {
throw new SQLException(Messages.get("error.prepare.paramindex",
Integer.toString(parameterIndex)),
"07009");
}
return parameters[parameterIndex - 1];
}
/**
* Generic setObject method.
*
* @param parameterIndex Parameter index 1 to n.
* @param x The value to set.
* @param targetSqlType The java.sql.Types constant describing the data.
* @param scale The decimal scale -1 if not set.
*/
public void setObjectBase(int parameterIndex, Object x, int targetSqlType, int scale)
throws SQLException {
checkOpen();
int length = 0;
if (targetSqlType == java.sql.Types.CLOB) {
targetSqlType = java.sql.Types.LONGVARCHAR;
} else if (targetSqlType == java.sql.Types.BLOB) {
targetSqlType = java.sql.Types.LONGVARBINARY;
}
if (x != null) {
x = Support.convert(this, x, targetSqlType, connection.getCharset());
if (scale >= 0) {
if (x instanceof BigDecimal) {
x = ((BigDecimal) x).setScale(scale, BigDecimal.ROUND_HALF_UP);
} else if (x instanceof Number) {
synchronized (f) {
f.setGroupingUsed(false);
f.setMaximumFractionDigits(scale);
x = Support.convert(this, f.format(x), targetSqlType,
connection.getCharset());
}
}
}
if (x instanceof Blob) {
Blob blob = (Blob) x;
length = (int) blob.length();
x = blob.getBinaryStream();
} else if (x instanceof Clob) {
Clob clob = (Clob) x;
length = (int) clob.length();
x = clob.getCharacterStream();
}
}
setParameter(parameterIndex, x, targetSqlType, scale, length);
}
/**
* Update the ParamInfo object for the specified parameter.
*
* @param parameterIndex Parameter index 1 to n.
* @param x The value to set.
* @param targetSqlType The java.sql.Types constant describing the data.
* @param scale The decimal scale -1 if not set.
* @param length The length of the data item.
*/
protected void setParameter(int parameterIndex, Object x, int targetSqlType, int scale, int length)
throws SQLException {
ParamInfo pi = getParameter(parameterIndex);
if ("ERROR".equals(Support.getJdbcTypeName(targetSqlType))) {
throw new SQLException(Messages.get("error.generic.badtype",
Integer.toString(targetSqlType)), "HY092");
}
// Update parameter descriptor
if (targetSqlType == java.sql.Types.DECIMAL
|| targetSqlType == java.sql.Types.NUMERIC) {
pi.precision = connection.getMaxPrecision();
if (x instanceof BigDecimal) {
x = Support.normalizeBigDecimal((BigDecimal) x, pi.precision);
pi.scale = ((BigDecimal) x).scale();
} else {
pi.scale = (scale < 0) ? TdsData.DEFAULT_SCALE : scale;
}
} else {
pi.scale = (scale < 0) ? 0 : scale;
}
if (x instanceof String) {
pi.length = ((String) x).length();
} else if (x instanceof byte[]) {
pi.length = ((byte[]) x).length;
} else {
pi.length = length;
}
if (x instanceof Date) {
x = new DateTime((Date) x);
} else if (x instanceof Time) {
x = new DateTime((Time) x);
} else if (x instanceof Timestamp) {
x = new DateTime((Timestamp) x);
}
pi.value = x;
pi.jdbcType = targetSqlType;
pi.isSet = true;
pi.isUnicode = connection.getUseUnicode();
}
/**
* Update the cached column meta data information.
*
* @param value The Column meta data array.
*/
void setColMetaData(ColInfo[] value) {
this.colMetaData = value;
}
/**
* Update the cached parameter meta data information.
*
* @param value The Column meta data array.
*/
void setParamMetaData(ParamInfo[] value) {
for (int i = 0; i < value.length && i < parameters.length; i++) {
if (!parameters[i].isSet) {
// Only update parameter descriptors if the user
// has not yet set them.
parameters[i].jdbcType = value[i].jdbcType;
parameters[i].isOutput = value[i].isOutput;
parameters[i].precision = value[i].precision;
parameters[i].scale = value[i].scale;
parameters[i].sqlType = value[i].sqlType;
}
}
}
// -------------------- java.sql.PreparedStatement methods follow -----------------
public void close() throws SQLException {
try {
super.close();
} finally {
// Null these fields to reduce memory usage while
// wating for Statement.finalize() to execute.
this.handles = null;
this.parameters = null;
}
}
public int executeUpdate() throws SQLException {
checkOpen();
initialize();
if (procName == null && !(this instanceof JtdsCallableStatement)) {
// Sync on the connection to make sure rollback() isn't called
// between the moment when the statement is prepared and the moment
// when it's executed.
synchronized (connection) {
String spName = connection.prepareSQL(this, sql, parameters, returnKeys, false);
executeSQL(sql, spName, parameters, returnKeys, true, false);
}
} else {
executeSQL(sql, procName, parameters, returnKeys, true, false);
}
int res = getUpdateCount();
return res == -1 ? 0 : res;
}
public void addBatch() throws SQLException {
checkOpen();
if (batchValues == null) {
batchValues = new ArrayList();
}
if (parameters.length == 0) {
// This is likely to be an error. Batch execution
// of a prepared statement with no parameters means
// exactly the same SQL will be executed each time!
batchValues.add(sql);
} else {
batchValues.add(parameters);
ParamInfo tmp[] = new ParamInfo[parameters.length];
for (int i = 0; i < parameters.length; ++i) {
tmp[i] = (ParamInfo) parameters[i].clone();
}
parameters = tmp;
}
}
public void clearParameters() throws SQLException {
checkOpen();
for (int i = 0; i < parameters.length; i++) {
parameters[i].clearInValue();
}
}
public boolean execute() throws SQLException {
checkOpen();
initialize();
boolean useCursor = useCursor(returnKeys, sqlWord);
if (procName == null && !(this instanceof JtdsCallableStatement)) {
// Sync on the connection to make sure rollback() isn't called
// between the moment when the statement is prepared and the moment
// when it's executed.
synchronized (connection) {
String spName = connection.prepareSQL(this, sql, parameters, returnKeys, useCursor);
return executeSQL(sql, spName, parameters, returnKeys, false, useCursor);
}
} else {
return executeSQL(sql, procName, parameters, returnKeys, false, useCursor);
}
}
public void setByte(int parameterIndex, byte x) throws SQLException {
setParameter(parameterIndex, new Integer((int) (x & 0xFF)), java.sql.Types.TINYINT, 0, 0);
}
public void setDouble(int parameterIndex, double x) throws SQLException {
setParameter(parameterIndex, new Double(x), java.sql.Types.DOUBLE, 0, 0);
}
public void setFloat(int parameterIndex, float x) throws SQLException {
setParameter(parameterIndex, new Float(x), java.sql.Types.REAL, 0, 0);
}
public void setInt(int parameterIndex, int x) throws SQLException {
setParameter(parameterIndex, new Integer(x), java.sql.Types.INTEGER, 0, 0);
}
public void setNull(int parameterIndex, int sqlType) throws SQLException {
if (sqlType == java.sql.Types.CLOB) {
sqlType = java.sql.Types.LONGVARCHAR;
} else if (sqlType == java.sql.Types.BLOB) {
sqlType = java.sql.Types.LONGVARBINARY;
}
setParameter(parameterIndex, null, sqlType, -1, 0);
}
public void setLong(int parameterIndex, long x) throws SQLException {
setParameter(parameterIndex, new Long(x), java.sql.Types.BIGINT, 0, 0);
}
public void setShort(int parameterIndex, short x) throws SQLException {
setParameter(parameterIndex, new Integer(x), java.sql.Types.SMALLINT, 0, 0);
}
public void setBoolean(int parameterIndex, boolean x) throws SQLException {
setParameter(parameterIndex, x ? Boolean.TRUE : Boolean.FALSE, BOOLEAN, 0, 0);
}
public void setBytes(int parameterIndex, byte[] x) throws SQLException {
setParameter(parameterIndex, x, java.sql.Types.BINARY, 0, 0);
}
public void setAsciiStream(int parameterIndex, InputStream inputStream, int length)
throws SQLException {
if (inputStream == null || length < 0) {
setParameter(parameterIndex, null, java.sql.Types.LONGVARCHAR, 0, 0);
} else {
try {
setCharacterStream(parameterIndex, new InputStreamReader(inputStream, "US-ASCII"), length);
} catch (UnsupportedEncodingException e) {
// Should never happen!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -