Итераторы SQL - PullRequest
       25

Итераторы SQL

0 голосов
/ 25 апреля 2009

Кто-нибудь знает хороший источник, где я могу найти информацию о реализации SQL итератора / оператора в Java и любых других языках? Чем ты, -Nimesh

Ответы [ 2 ]

1 голос
/ 25 апреля 2009

Я собираюсь пойти с интерпретацией Илии, которую Нимеш на самом деле имел в виду: «Можно ли сделать обертку итеративной для ResultSet. Идея. Так как нет стандартного (насколько я знаю) ResultSetRow, он возвращает Object [] для каждой строки.

Существуют некоторые существенные проблемы с этой концепцией, не в последнюю очередь то, что Iterator не разрешается генерировать, поэтому исключения SQLE обрабатываются как можно лучше «на месте». Кроме того, ResultSet - очень сложный и многофункциональный зверь (см. Например перегруженные методы для каждого типа). Эту сложность можно частично использовать в своих интересах, но это не так. Например, могут быть такие методы, как getIntIterable(ResultSet rs), который возвращает Iterable<int[]>. Метод может проверить getColumnType s объекта ResultSetMetadata. Таким образом, он может генерировать (если, например, не все столбцы являются целыми) перед созданием Iterable, методы которого не могут генерировать.

public static class ResultSetIterable implements Iterable<Object[]>
{
private ResultSet rs;
private int columnCount;

public ResultSetIterable(ResultSet rs) throws SQLException
{
    this.rs = rs;
    columnCount = rs.getMetaData().getColumnCount();
}

public Iterator<Object[]> iterator()
{
    return new Iterator<Object[]>() 
    {
    private boolean moreRows;
    {
        try
        {
        moreRows = rs.first();
        }
        catch(SQLException e)
        {
        moreRows = false;
        }
    }

    public boolean hasNext()
    {
        boolean knownClosed = false;
        try
        {
        knownClosed = rs.isClosed();
        }
        catch(Throwable e)
        {
        // Ignore possible SQLException or AbstractMethodError or...
        }

        return !knownClosed && moreRows;
    }

    public Object[] next()
    {
        Object[] curRow = new Object[columnCount];
        for(int i = 1; i <= columnCount; i++)
        {
        try
        {
            curRow[i - 1] = rs.getObject(i);
        }
        catch(SQLException e)
        {
            curRow[i - 1] = null;
        }
        }
        try
        {
        moreRows = rs.next();
        }
        catch(SQLException e)
        {
        moreRows = false;
        }
        return curRow;
    }

    public void remove()
    {
        try
        {
        rs.previous();
        rs.deleteRow();
        }
        catch(SQLException e)
        {
        throw new UnsupportedOperationException("ResultSetIterable does not support remove for this ResultSet type.");
        }
    }
    };
}
}
0 голосов
/ 25 апреля 2009

Как насчет взглянуть на некоторый исходный код драйверов JDK или jdbc с открытым исходным кодом, таких как mysql?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...