Введение
Для тех кто не в курсе, ODBC позволяет абстрагироваться от интерфейса конкретной СУБД. Это некоторая прослойка, в которой вы можете настроить источник данных, дать ему имя и общаться с ним на уровне ODBC API. При замене движка СУБД вы меняете лишь файлы настройки ODBC, не меняя исходный код программы.
Основа ODBC нативный проект Windows, хотя его родитель CLI (Call Layer Interface) - открытый и ведется XOpen. Под *nix системы существует реализация unixODBC. Для общения с ODBC на языке C++ существует libodbc++.
Установка
В Windows всё должно работать из коробки. Рассмотрим установку в gentoo.
sudo emerge -av unixODBC
sudo emerge -av libodbc++
С PostgreSQL драйвером некоторые трудности... В портежах по умолчанию он отсутствует, а в дефолтных оверлеях старьё. Поэтому пришлось накорябать свой (git://github.com/hoxnox/hoxnox-portage-overlay.git).
echo "dev-db/psqlodbc ~amd64" | sudo tee -a /etc/portage/package.keywords
sudo emerge -av psqlodbc
Настройка ODBC
Существует GUI утилиты (unixODBC-GUI-Qt), но нормально собрать их из оверлея qt или из исходников у меня не получилось. Поэтому вручную поправим конфиги (/etc/unixODBC/odbcinst.ini и /etc/unixODBC/odbc.ini) соответственно:
[ODBC]
Trace=yes
TraceFile=/tmp/odbc_log.txt
[PostgreSQL]
driver=/usr/lib/psqlodbcw.so
setup=/usr/lib/psqlodbcw.so
[Test]
driver=PostgreSQL
Servername=localhost
Username=postgres
Password=********
Port=5432
Database=test
Пример на C++
#include <odbc++/drivermanager.h>
#include <odbc++/connection.h>
#include <odbc++/preparedstatement.h>
#include <odbc++/resultset.h>
#include <iostream>
using namespace std;
using namespace odbc;
int main(int argc, char **argv)
{
//Get the Driver manager
DriverManager *dm;
//Open the connection, specifiying the DSN.
Connection *c = dm->getConnection("DSN=Test;uid=postgresql;pwd=*********");
//Create the Query
PreparedStatement *s = c->prepareStatement(
ODBCXX_STRING_CONST("SELECT ip FROM ip LIMIT 5"));
ResultSet *r;
//Execute the Query
s->execute();
//Get initial ResultSet
r = s->getResultSet();
while(r->next())
{
//Extract column information
cout << "Column (ip): " << r->getInt("ip") << endl;
}
//Clean everything
delete r;
delete s;
delete c;
return 0;
}
Производительность
TODO:
Полезные ссылки
- unixODBC : http://www.unixodbc.org/
- libodbc++ reference : http://libodbcxx.sourceforge.net/libodbc++/progref/namespaceodbc.html
Comments
comments powered by Disqus