Вопрос JDBC: не в состоянии правильно связать переменные и значения (сокращено) - PullRequest
2 голосов
/ 28 апреля 2011

Я работаю над проектом, который можно описать следующим образом: пользователь передаст имя таблицы и некоторые критерии.Затем программа извлечет таблицу из Oracle и покажет результаты пользователю.После этого пользователь получит возможность изменять ячейки подряд, сохранять изменения и отправлять их обратно в Oracle.Сейчас я пишу «generalDAO», который делает все эти вещи и работает для любой пройденной таблицы.(Одна из причин, по которой мы пытаемся сделать это в общих настройках, заключается в том, что у нас есть более 50 таблиц для работы.) В любом случае, я могу делать все, кроме правильного связывания переменных с обновленными значениями.Я думаю, что я облажался с логикой этого.Если у кого-то есть время и терпение, чтобы поработать над этим, я буду признателен за любую помощь или предложения.Чтобы сделать это конкретнее, давайте предположим, что таблица, с которой я работаю, называется «КНИГИ» и имеет следующие столбцы: book_id (также PK), title, author_last_name, author_first_name и rating.

(getPrimaryKeyэто простой метод, который запрашивает таблицу метаданных для PK таблицы. row - это связная хеш-карта, которая содержит имена столбцов в качестве ключей - в значении есть другая информация, но она не связана)

Вот примероператор обновления, который составлен:

UPDATE BOOKS SET BOOK_ID=?, TITLE=?, AUTHOR_LAST_NAME=?, AUTHOR_FIRST_NAME=?, RATING=? WHERE BOOK_ID=?

Так что это все хорошо.Моя проблема в том, что я не могу получить значения для правильного сопряжения с правильными столбцами.Одним словом, изменения сохраняются в списке следующим образом:

(primarykey1value, primarykey2value, ..., column1value, column2value, ..., columnnvalue)

, нозапрос настроен как:

(столбец 1, столбец 2, столбец 3, ..., primarykey1, primarykey 2 ...)

Так что, если я просто напишу цикл for для запускачерез запрос я в итоге привяжу значения следующим образом:

UPDATE BOOKS SET BOOK_ID=primarykey1value, TITLE=primarykey2value, AUTHOR_LAST_NAME=?, AUTHOR_FIRST_NAME=?, RATING=? WHERE BOOK_ID=?

И так далее.Короче говоря, проблема в том, что соединение не является правильным.

Вот мой код:

public void update(String tableName, List dataList){    

    LinkedHashMap primaryKeyMap=getPrimaryKey(tableName);
    Iterator itr=dataList.iterator();

    Connection conn=null;
    PreparedStatement ps=null;

    try {
        conn=ConnectionHelper.getConnection();
        conn.setAutoCommit(false);

        LinkedHashMap row=null;

        while(itr.hasNext()){
            row=(LinkedHashMap)itr.next();                      
            SQLVO vo=makeUpdate(tableName, primaryKeyMap, row); 
            String sql=vo.getSql();                                 
            int totalCount=vo.getColCount()+vo.getPkCount();                        
            int upperBd=totalCount-vo.getPkCount()+1;           
            int colBd=vo.getColCount();
            ps=conn.prepareStatement(sql);                              
            Iterator iter=row.entrySet().iterator();  



            //if("Y".equals(checker)){
                for(int i=upperBd; i <=totalCount; i++){    
                    Map.Entry pairs=(Map.Entry)iter.next();
                    ps.setString(i, (String)pairs.getValue());
                    System.out.println(" This is the associated value: "+pairs.getValue()); //      
                }

                for(int i=1; i<=colBd; i++){
                    Map.Entry pairs=(Map.Entry)iter.next();
                    ps.setString(i, (String)pairs.getValue());
                }

                ps.addBatch();
            //} 
        }
            int updateCounts[]=ps.executeBatch();
            conn.commit();

    } catch (Exception e) {
        e.printStackTrace();    
        DAOException daoe = new DAOException(e.getMessage());
        throw daoe;
    } finally {
        ConnectionHelper.close(conn);
    }   
}

У кого-нибудь есть опыт решения подобных проблем?Два цикла for явно не верны, и я получаю ошибки «NoSuchElementException».Но я не знаю, как поступить.

В любом случае, любая помощь будет признательна - как подсказывает моя ручка, я новичок во всем этом.Извините за столь длительный пост, но, надеюсь, поможет полный вопрос.

1 Ответ

0 голосов
/ 29 апреля 2011

Если значения должны использоваться в разных емкостях (то есть значение против PK), вам нужно будет сопоставить их уникально либо по индексу, либо по паре имя / значение.

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