среда, 1 августа 2012 г.

Java доступ к ODBC

В языке Java для работы с источниками данных применяются различные технологии, в частности доступ к базе данных возможен через ODBC подсистему Windows. В составе Java™ Platform имеется набор классов объединенных общим названием JDBC-ODBC Bridge...

Классы размещаются в сборке rt.jar в папке \sun\jdbc\odbc\. Допустим надо получить доступ к локальному файлу MS Access (файл с расширением mdb). Сначала создадим через Администрирование->Источники данных (ODBC) системный DSN указав драйвером Microsoft Access (*.mdb). Предполагая валидность введенных настроечных параметров жмем 'OK'. Теперь можно использовать созданный DSN в тексте Java программы:

    String dsn = "Data Source Name";
    String dbURL = "jdbc:odbc:" + dsn;
    try
    { 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection con = DriverManager.getConnection(dbURL, "user", "password"); 
        Statement s = con.createStatement();
        s.execute("select * from tablename");
        ResultSet rs = s.getResultSet();
        s.close();
        con.close();
    }
    catch (Exception err)
    {
        System.out.println( "Error: " + err );
    }

Доступ к объявленному DSN осуществляется в строке URL в формате протокол:субпротокол:источник данных. JDBC поддерживает множество драйверов для доступа к различным базам данных. Конкретный драйвер указывается в субпротоколе. Поля "user" и "password" замените реальными значениями или оставьте пустыми если база данных открытая.

P.S. Базы данных MS Access часто содержат кириллицу. Если результирующий набор возвращает символьный мусор, установите кодировку вручную. Для этого удобно воспользоваться классом Properties:

    String dsn = "Data Source Name";
    String dbURL = "jdbc:odbc:" + dsn;
    try
    { 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Properties conInfo = new Properties();
        conInfo.put("user", "");
        conInfo.put("password","");
        conInfo.put("charSet", "Cp1251");
        Connection con = DriverManager.getConnection(dbURL, conInfo); 
        Statement s = con.createStatement();
        s.execute("select * from tablename");
        ResultSet rs = s.getResultSet();
        s.close();
        con.close();
    }
    catch (Exception err)
    {
        System.out.println( "Error: " + err );
    }

И конечно не забудьте включить

import java.sql.*;
import java.util.properties;