Ensaio acerca de bibliotecas de código aberto para abstração de acesso a banco de dados em linguagem C++

Este estudo é um ensaio acerca das ferramentas de programação em linguagem C++ destinadas a fornecer uma camada de abstração para operar indistintamente bibliotecas clientes nativas de servidores de banco de dados.

[ Hits: 19.889 ]

Por: Renato Merli em 20/10/2011


DBIxx



1. Introdução

DBIxx [3] , assim como GDAmm, também é um wrapper, que no caso, encapsula a biblioteca DBI [9] . Inspirada na sintaxe da biblioteca SOCI [3], DBIxx também oferece ferramentas de fácil utilização para criação de consultas SQL e tratamento de dados.

É uma difícil decisão de projeto escolher entre a adoção de DBIxx e SOCI, já que as mesmas têm API's extremamente semelhantes.

DBI (e conseqüentemente DBIxx) opera sobre Firebird, Interbase, MySQL, PostgreSQL, Sqlite3, alem de MS SQL e Sybase através da biblioteca FreeTDS [10].

2. Principais componentes

Parte considerável dos objetos de DBIxx tem correspondente na API de SOCI, às vezes utilizando o mesmo nome. Tendo SOCI como referencia, o exemplo abaixo é praticamente auto-explicativo.

using namespace dbixx;
using namespace std;

int main()
{
    try {
        session sql("sqlite3:dbname=test.db;sqlite3_dbdir=./");

        sql<<"DROP TABLE IF EXISTS users";
        sql.exec();
        sql<<"CREATE TABLE users ( "
             " id integer primary key not null, "
             " name varchar(128) not null "
             ");";
        sql.exec();
        sql<<"INSERT INTO users(id,name) VALUES(?,?)",
             1,"Moshe",exec();
        sql<<"INSERT INTO users(id,name) VALUES(?,?)",
             2,"Yossi",exec();
        sql<<"SELECT name FROM users WHERE id=?",1;
        row r;
        if(sql.single(r)) {
            string name;
            r>>name;
            cout<<name<<endl;
        }
        else {
            cout<<"No user with id="<<1<<endl;
        }
        result res;
        sql<<"SELECT id,name FROM users";
        sql.fetch(res);
        cout<<"There are "<<res.rows()<<" users\n";
        while(res.next(r)) {
            int id;
            string name;
            r>>id>>name;
            cout<<id<<"\t"<<name<<endl;
        }
    }
    catch(std::exception const &e) {
        cerr<<e.what()<<endl;
        return 1;
    }
    return 0;
}

Ao primeiro olhar percebemos uma sintaxe ligeiramente diferente para composição de strings de instruções SQL, alem necessidade de chamar o método exec() parar efetivamente realizar as operações, mas percebemos também a sintaxe básica de SOCI.

Para realizar a conexão com o banco, temos um objeto de mesmo nome, mas com passagem de parâmetros ligeiramente diferente:

session sql("sqlite3:dbname=test.db;sqlite3_dbdir=./");

O uso de intratores para especificar instruções SQL ao objeto de conexão:

sql<<"DROP TABLE IF EXISTS users";

E um mecanismo de recuperação de dados parecido com o utilizado através das classes soci::statement e statement.fech() de SOCI, utilizando o objeto dbixx::result juntamente com método result.next():

soci::result res;
sql<<"SELECT id,name FROM users";
sql.fetch(res);
while(res.next(r)) { (...) }

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. GDAmm
   3. SOCI
   4. DBIxx
   5. Outras ferramentas e referências
Outros artigos deste autor

Introdução à plataforma GNU de desenvolvimento

Leitura recomendada

Acessando PostgreSQL com C

Acessando PostgreSQL com C - Cursores

Usando MySQL na linguagem C

PostgreSQL - Embutindo comandos SQL no seu código C

Embutindo um banco de dados SQLite em sua aplicação C++

  
Comentários
[1] Comentário enviado por julio_hoffimann em 20/10/2011 - 22:57h

Oi Renato,

Ótima coletânea!

Abraço!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts