class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

JDBC

загрузка драйвера
соединение с БД
выполнение запросов
параметризованные запросы

ODBC

ODBC
ODBC для wxWidgets
JDBC - ODBC мост

ADO

ADO

VCL

VCL компоненты

PHP

PHP

DBI (perl)

dbi пример

Hibernate

Hibernate

Справка по ODBC

Стандарт ODBC

ODBC является первым стандартом для доступа к различным СУБД. В настоящее время odbc драйвера существуют и для Windows и на *nix системах. Данный стандарт определяет не только множество функций, но и сам синтаксис SQL - стандарт X/Open SQL. Если СУБД не поддерживает что-либо напрямую, то драйвер должен преобразовать код в понятный для СУБД вид. Программы не работают с драйверами напрямую. Вместо этого они делают запросы к менеджеру драйверов odbc, указывая имя источника данных - DSN (data source name). DSN в свою очередь определяет используемый драйвер и различные настройки соединения. В Windows посмотреть список установленных драйверов и создать новый источник можно следующим образом.

панель управления->администрирование-> источники данных (ODBC)

Пользователи *nix систем могут посмотреть проект unixODBC , где можно скачать менеджер драйверов и посмотреть список существующих драйверов.

http://www.unixodbc.org/

Для примера создадим DSN для PostgreSQL в Windows. Драйвера автоматически устанавливаются при установке СУБД. Запускаем базу, запускаем pgAdmin3.exe и соединяемся с базой (это для проверки). Заходим в источники данных ODBC, переходим на вкладку пользовательский dsn и жмем кнопку добавить. В списке драйверов выбираем нужный (PostgreSQL ANSI или PostgreSQL Unicode). Далее в появившемся окне задаем имя источника данных (Data Source), имя сервера и имя хоста. Последние данные можно посмотреть в pgAdmin3. Имя пользователя и пароль заполнять не нужно, сразу жмем кнопку тест. Если все нормально отобразится соответствующее сообщение. Ниже приведен список некоторых функций odbc api:

Ниже приведен пример использования этих функций. При этом предполагается наличие в системе PostgreSQL35W DSN, пользователя root с паролем root1 в базе данных, и таблица tblname с двумя полями id и str. При компиляции программы не забудьте подключить библиотеку odbc32.lib (libodbc32.a для MinGW).


#include <iostream>
#include <windows.h>
#include <sqlext.h>
using namespace std;

inline int sqlok(SQLRETURN r){
return r == SQL_SUCCESS ||
       r == SQL_SUCCESS_WITH_INFO;
}

inline int fetchok(SQLRETURN r){
return !(r==SQL_ERROR || 
         r==SQL_SUCCESS_WITH_INFO ||
         r==SQL_NO_DATA);
}

enum SQLER{E1=1, E2, E3, E4, E5, E6, E7};

int main() {
SQLHENV henv=0;
SQLHDBC db=0;
SQLHSTMT sql=0;

int _timeout = 10;
SQLPOINTER timeout=&_timeout;

try{
// создаем объект odbc окружения
if(!sqlok(SQLAllocHandle(SQL_HANDLE_ENV, 
            SQL_NULL_HANDLE, &henv)))
	throw E1;
	
// указываем версию ODBC
if(!sqlok(SQLSetEnvAttr(henv, 
          SQL_ATTR_ODBC_VERSION, 
	    (void*)SQL_OV_ODBC3, 0)))
	throw E2;

// создаем объект базы данных
if(!sqlok(SQLAllocHandle(SQL_HANDLE_DBC, 
          henv, &db)))
	throw E3;

// устанавливаем максимальное время соединения
if(!sqlok(SQLSetConnectAttr(db, 
          SQL_LOGIN_TIMEOUT, 
          (SQLPOINTER)(timeout), 0)))
	throw E4;

// соединяемся к источнику данных
if(!sqlok(SQLConnect(db, (SQLCHAR*) "PostgreSQL35W", 
            	   SQL_NTS, (SQLCHAR*) "root",
                     0, (SQLCHAR*) "root3", 0)))
	throw E5;

// создаем объект sql команды	
if(!sqlok(SQLAllocHandle(SQL_HANDLE_STMT,
               db, &sql)))
	throw E6;

// выполняем обычный запрос
if(!sqlok(SQLExecDirect(sql,
          (SQLCHAR*)"select * from tblname",
          SQL_NTS)))
    throw E7;

// переменные для значений полей
SQLINTEGER id=0;
SQLCHAR str[255];
SQLINTEGER realsize=0;

// берем следующую запись в выборке
// используем то, что размер курсора 
// по умолчанию одна запись
while(fetchok(SQLFetch(sql))){
   SQLGetData(sql, 1, SQL_INTEGER, 
              &id, 0, &realsize);
   SQLGetData(sql, 2, SQL_CHAR, 
              str, 255, &realsize);
   cout<<id<<" | "<<str<<endl;
}             
}catch(SQLER i){
// обработка ошибок
switch(i){
case E1: cout<<"error on alloc env\\n";
        break;
case E2: cout<<"error on set odbc version\\n";
        break;
case E3: cout<<"error on alloc db\\n";
        break;
case E4: cout<<"error on set timeout\\n";
        break;
case E5: cout<<"error on connect\\n";
        break;
case E6: cout<<"error on alloc sql\\n";
        break;
case E7: cout<<"error on execute sql\\n";
        break;        
}	
}

// освобождение ресурсов
if(sql)
   SQLFreeHandle(SQL_HANDLE_STMT, sql);

if(db){
   SQLDisconnect(db);
   SQLFreeHandle(SQL_HANDLE_DBC, db);
}
  
if(henv)
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

Рейтинг@Mail.ru