Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выборка из dbf-файлов, подскажите оптимальный вариант 
V
    Опции темы
check
Дата 13.4.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Нужно сделать выборку из нескольких связанных dbf-файлов.
Собственно сама выборка прблемы не представляет,  проблема в объёме
данных.  Для работы с dbf использую ODBC драйвер.  
В качестве альтернатива попробовал ещё JDBF-1.0.  На ODBC решил остановиться
потому что он позволяет работать с dbf через SQL, что в моем случае очень удобно(во всяком случае я так думал поначалу).


Структура такая:  есть файл 1.dbf в котором содержиться большая
часть нужных мне полей:
Код

field1
field2
ist
ista
field3
filed4
....
Есть файл 2.dbf
Код

kod1
kod2
kod3
kod4
name
kbk


Есть файл 3.dbf  через который связаны 1.dbf и 2.dbf:
Код

ist
ista
kod1
kod2
kod3
kod4


Конкретно сейчас я хочу выбрать из 3.dbf соответствующие  kod1, kod2, kod3 и kod4
для каждой строки 1.dbf.  Связь по ist,  ista.
Написать запрос с объединением я не могу,  потому-что для запроса может
использоваться только один объект Statement,  а файлы находятся в разных
папках.  
Для этого драйвера в JDBC URL указывается путь к папке с dbf-файлами, 
Код

url = "jdbc:odbc:Driver={Microsoft dBase Driver (*.dbf)};DBQ=c:/arm";

другими словами эти два файла относятся к разным базам данных.

Поэтому я делаю так:
Код

    public ArrayList get1Dbf000() throws SQLException {
        ArrayList HashMapList = new ArrayList();
        ResultSet rs = st.executeQuery("SELECT NPD,IST,ISTA,SUM,DVP FROM dbf000");
        while (rs.next()) {
            HashMap dbf000Fields = new HashMap();
            dbf000Fields.put("Npd", rs.getString("NPD"));
            dbf000Fields.put("Ist", rs.getString("IST"));
            dbf000Fields.put("Ista", rs.getString("ISTA"));
            dbf000Fields.put("Sum", rs.getString("SUM"));
            dbf000Fields.put("Dvp", rs.getString("DVP"));
            HashMapList.add(dbf000Fields);
        }

        return HashMapList;
    }
Это метод который выбирает все нужные поля 1.dbf и возвращает ArrayList
со всеми записями файла.  Точнее говоря ArrayList, элементами которого
являются   HashMap-ы с именами полей в качестве ключей.
 
По выбранным ist и ista извлекаются kod1, kod2, kod3 и kod4 из 3.dbf
Код

    public HashMap getIstkbk(String ist, String ista) throws SQLException {
        HashMap Istkbk = new HashMap();
        PreparedStatement prst = con.prepareStatement("SELECT KOD1, KOD2, KOD3, KOD4 FROM ISTKBK WHERE IST = ? AND ISTA = ?");
        prst.setString(1, ist);
        prst.setString(2, ista);
        ResultSet res = prst.executeQuery();
        while (res.next()) {
            int kod1 = res.getInt("KOD1");   System.out.print(kod1 + "  ");
            int kod2 = res.getInt("KOD2");   System.out.print(kod2 + "  ");
            int kod3 = res.getInt("KOD3");   System.out.print(kod3 + "  ");
            int kod4 = res.getInt("KOD4");   System.out.print(kod3 + "\n");
            Istkbk.put("kod1", Integer.toString(kod1));
            Istkbk.put("kod2", Integer.toString(kod2));
            Istkbk.put("kod3", Integer.toString(kod3));
            Istkbk.put("kod4", Integer.toString(kod4));
        }
        return Istkbk;
    }


Вызывается этот метод для каждой(!) строки 1.dbf
Код

       ArrayList dbf000List = reader.getDbf000();
       Iterator iter = dbf000List.iterator();
       while (iter.hasNext()) {
          HashMap row = (HashMap)iter.next();
          zreader.getIstkbk((String)row.get("Ist"), (String)row.get("Ista"));  
       }


Строк сейчас где-то 55000,  а может быть гораздо больше.
В результате после извлечения n-го количества строк выдается ошибка
Код

Exception in thread "main" java.sql.SQLException: [Microsoft][Драйвер ODBC dBase] Открытие большего числа таблиц невозможно.


Какие есть более удачные способы решить эту задачку?

Это сообщение отредактировал(а) check - 13.4.2007, 16:13
PM MAIL   Вверх
tux
Дата 13.4.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Цитата(check @  13.4.2007,  16:08 Найти цитируемый пост)

Какие есть более удачные способы решить эту задачку?

Мне кажется достаточным просто закрывать ResultSet и PreparedStatement перед возвратом результата.
PM MAIL Skype GTalk Jabber YIM   Вверх
check
Дата 13.4.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Упс!  
tux,  большое спасибо.   Убедиться в том,  что всё нормуль смогу только в понедельник.   
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.