Jdbc列索引超出范围

时间:2014-07-04 14:26:22

标签: java mysql jdbc

任何人都可以告诉我为什么getColumnClassName会告诉我,当rs.getString调用该行之前,列索引超出范围,然后我开始迭代1?

int i = 1;
    while (rs.next()) {

        columns.put("id", Integer.toString(i));
        columns.put("name", rs.getString(4));
        columns.put("type", rs.getMetaData().getColumnClassName(i));
        columns.put("nullable", Integer.toString(rs.getMetaData().isNullable(i)));

        i++;
        s.add(columns);
    }
    return s;

1 个答案:

答案 0 :(得分:1)

每次通过while循环时,您的i变量需要重置为1。当前逻辑将在第二条记录上为getColumnClassName(2),在第三条记录上为getColumnClassName(3),等等。如果您的记录多于所选列,则会使索引超出范围错误。

目前尚不清楚您是想要从记录中获取数据还是仅仅返回有关返回列的元数据。

如果您实际上想要迭代所有列以获取类型信息,则需要获取column count并使用它。

final int cnt = rs.getMetaData().getColumnCount();

for (int i=0; i<cnt; ++i)
{
    columns.put("id", Integer.toString(i));
    columns.put("name", rs.getMetaData().getColumnName());
    columns.put("type", rs.getMetaData().getColumnClassName(i));
    columns.put("nullable", Integer.toString(rs.getMetaData().isNullable(i)));

    s.add(columns);
}