Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > выборка из dbf-файлов


Автор: check 13.4.2007, 16:08
Нужно сделать выборку из нескольких связанных 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] Открытие большего числа таблиц невозможно.


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

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

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

Мне кажется достаточным просто закрывать ResultSet и PreparedStatement перед возвратом результата.

Автор: check 13.4.2007, 19:06
Упс!  
tux,  большое спасибо.   Убедиться в том,  что всё нормуль смогу только в понедельник.   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)