8

我遇到了以下代码,我觉得它做错了:

(请注意,这是 JDK 1.4.2,因此未键入列表)

StringBuffer queryBuffer = new StringBuffer();
ArrayList temp = new ArrayList();

... 
queryBuffer.append("and sb.POSTCODE = ? ");
temp.add(postcode);
...

conn = ConnectionManager.getConnection();       
pstmt = conn.prepareStatement(queryBuffer.toString());

这就是我所关心的:

for(int i=0; i<temp.size(); i++) {
    log.debug("setString("+ (i+1) + "," + (String)temp.get(i) + ")");
    pstmt.setString(i+1, (String)temp.get(i));
}

但是我注意到数据库中一些对应的数据类型(字段)是整数,还有日期,这样可以吗?

4

2 回答 2

9

考虑使用 PreparedStatement setObject()方法而不是setString()

如果在编译时类型未知, PreparedStatement setObject()将尝试为您转换任何java.lang类型。

所以使用更新的 for 循环(假设你有 java 5.0)和通用的 null 处理:

int i = 0;
for(Object value : temp) {
    if (value == null) {
        // set null parameter if value type is null and type is unknown
        pstmt.setNull(++i, Integer.MIN_VALUE); 
    } else {
        pstmt.setObject(++i, value);
    }
}

注意setNull()可以接受一个类型作为第二个参数,如果它是已知的。

于 2012-05-16T02:07:02.570 回答
0

这对我没有帮助。下面是附加绑定变量后构建的查询。从 ACC_TABLE 中选择 ACC_NO,其中 ACC_NAME='java.lang.String';

它正在尝试转换为 java.lang.String 类型并导致以下异常 java.sql.SQLException:无法执行 sql 命令 - 原始消息:null

我的 ACC_NAME 是“user01”。所以实际上查询应该是这样的,select ACC_NO from ACC_TABLE where ACC_NAME='user01';

所以如果我的理解没有错的话,preparedStatement.setObject(index, object) 就是将数据转换成其各自的数据类型并进行设置。

MySQL 中的preparedStatement.setObject(index, object) 运行良好,没有任何问题。唯一的问题是在使用 Oracle 时。我正在使用的 Oracle DB 版本是

Oracle Database 11g Express Edition 版本 11.2.0.2.0 - 生产 PL/SQL 版本 11.2.0.2.0 - 用于 32 位 Windows 的生产“CORE 11.2.0.2.0 生产”TNS:版本 11.2.0.2.0 - 生产 NLSRTL 版本11.2.0.2.0 - 生产

于 2013-10-08T14:47:31.333 回答