Archive for the 'SQL' Category

03
Sep
08

GNU/Linux + Qt4 + MS SQL Server

A veces vamos a necesitar que nuestras aplicaciones desarrolladas con Qt se puedan conectar con el SQL Server de Microsoft, esto puede ser por muchas razones, la mia en esta ocasión fue porque eso estamos estudiando en la universidad y sinceramente es muy bueno y mucho mas fácil de utilizar, a pesar de ser un linuxero safado.

Nuestra apliacación corriendo en Windows no nos presenta ningún problema, simplemente configuramos en el panel de control, herramientas administrativas, origenes de datos (ODBC) una conexión con SQL Server y ya esta, en Linux es donde se pone fea la cosa, asi que entremosle.

Los pasos aqui presentados son para Mandriva 2008.1 Spring, pero puede aplicarse a cualquier distribución con unos pequeños cambios.

Los necesario para lograr esto es unixODBC y freeTDS que seria como el driver de MS SQL Server para unixODBC, el problema es que que este driver no soporta unicode, entonces en la aplicación Qt nos dará el siguiente error:

qGetStringData: Error while fetching data (-1), y ese error ni a patadas se compone,
solamente modificando las fuentes de Qt y compilarlo.

unixODBC y freeTDS

Para lograr la comunicación con el SQL Server vamos a necesitar el unixODBC, Mandriva ya lo trae y en los repositorios podemos encontrar todo lo necesario, PERO el problema es que si compilamos nosotros mismos Qt no funcionará con ese unixODBC, da un monton de violaciones al segmento, lei por ahi que el driver ODBC de Qt puede dar problemas con unixODBC si estos no estan compilados con la misma version del compilador o algo asi, no recuerdo bien como era, asi que lo primero que hacemos es bajarnos el unixODBC de http://www.unixodbc.org/. Para no complicarnos la vida vamos a usar los paquetes de Mandriva y luego a instalar encima el unixODBC que vamos a compilar, asi que los paquetes que necesitamos instalar son los siguientes:

unixODBC, unixODBC-gui-qt, lib, libunixODBC1-devel, libunixODBC1, libunixODBC-qt

el freeTDS tambien:

libfreetds-devel, libfreetds_mssql-devel, libfreetds0, libfreetds0-unixodbc, libfreetds_mssql0, libfreetds_mssql0-unixodbc

ahora descomprimimos las fuentes de unixODBC, lo configuramos asi:

./configure –sysconfdir=/etc –disable-gui –prefix=/usr

lo instalamos en /usr para que reemplace el paquete de Mandriva, deshabilitamos el gui ya que se vuelve un relajo compilarlo en Mandriva con la mezcla rara de qt3 y la 4 que hay, de todos modos ya tenemos el unixODBC-gui-qt y ese vamos a usar.

luego make y make install, y listo.

Compilar Qt

ahora nos bajamos las fuentes de Qt de http://trolltech.com/downloads ahorita esta la version 4.4.1, descomprimimos las fuentes y buscamos el archivo “qsql_odbc.h”, este esta aqui:

<directorio donde descomprimieron>/qt-x11-opensource-src-4.4.1/src/sql/drivers/odbc/

editamos este archivo y buscamos #ifdef Q_OS_UNIX y le vamos a agregar # define Q_ODBC_VERSION_2, entonces lo dejamos asi:

#ifdef Q_OS_UNIX
#define HAVE_LONG_LONG 1 // force UnixODBC NOT to fall back to a struct for BIGINTs

// le pongo esto para que funcione con los drivers que no son compatibles
// con unicode
# define Q_ODBC_VERSION_2 //linea que agregamos

#endif

lo guardamos y a compilar, todo lo hacemos desde <directorio donde descomprimieron>/qt-x11-opensource-src-4.4.1/:

./configure -prefix /usr/lib/qt4 -plugin-sql-odbc -plugin-sql-sqlite -plugin-sql-mysql -plugin-sql-oci -assistant-webkit -v

configuramos la compilación de Qt, importante indicarle los plugins para las bases de datos, en este caso el importante es el -plugin-sql-odbc, de ahi otras extras que puse, en prefix el puse /usr/lib/qt4 para que reemplace el que trae Mandriva y asi ya esta todo configurado y funciona al chilazo.

gmake y gmake install

con esto hecho ya casi estamos listos para que nuestra aplicación se conecte con SQL Server.

Configurando unixODBC y freeTDS

configuramos odbc con el archivo /etc/odbc.ini y agregamos lo siguiente:

[MSSQLJDBC]
Description        = FreeTDS MSSQL Server
Driver        = FreeTDS MSSQL Server
Servername        = MSJDBC
Database        = Universidad
UID        = <usuario de la bd>
PWD        = <clave del usuario>
Port        = <puerto por lo general 1433>
Trace        = Yes

en /etc/odbcinst.ini agregamos lo siguiente:

[FreeTDS MSSQL Server]
Description    = TDS MSSQL JDBC Server
Driver          = /usr/lib/libtdsodbc_mssql.so.0
Setup           = /usr/lib/libtdsS.so.1
FileUsage    = 1

[ODBC]
Trace     = yes
TraceFile = /tmp/odbc.log

en /etc/freetds_mssql.conf agregamos lo siguiente:

[MSJDBC]
host = <host del servidor SQL Server, en el mio
192.168.2.2>
port = <puesto, en el mio
1433>
tds version = 8.0
client charset = UTF-8

si ejecutamos /usr/bin/ODBCConfig-root podremos configurar el ODBC facilito.

Con esto hecho ya podemos usar nuestra aplicacion Qt4 con SQL Server

QSqlDatabase defaultDB = &QSqlDatabase::addDatabase ( “QODBC” );
if ( ! defaultDB )
{
QMessageBox::critical ( this, “error” , “No se pudo conectar con el driver”);
return;
}

defaultDB->setDatabaseName ( “MSSQLJDBC” );  //el que configuramos en odbc.ini
defaultDB->setUserName ( “usuario” );
defaultDB->setPassword ( “clave” );

algo muy importante es que el todos los querys tienen que estar en modo Fordward only, ya con eso podemos hacer consultas y todo eso:

QSqlQuery *query = new QSqlQuery( defaultDB );
query->setForwardOnly ( true );
query->exec( “select
nombre_alumno from Alumno” );
query->first();
label->setText(“Nombre: ” + query->value(0).toString() );

ahora si nos devolverá los valores que queremos, no como antes que nos salia “qGetStringData: Error while fetching data (-1)”

Para obtener los parámetros de salida de un procedimiento almacenado podemos hacerlo asi:

QString ejecutar=”DECLARE @nombre nvarchar(80)”;
ejecutar+=”; DECLARE @apellido nvarchar(80)”;
ejecutar+=”; execute buscarlumno 200308064, @nombre OUTPUT, @apellido OUTPUT”;
ejecutar+=”; select @nombre, @apellido”;
query->exec( eje );
query->first();
label->setText(“Nombre: ” + query->value(0).toString() + ” Apellido: ” + query->value(1).toString() );

el procedimiento que llamamos arriba es el siguiente en la base de datos:

CREATE PROCEDURE buscarlumno ( @car bigint, @nombre nvarchar(80) output, @apell nvarchar(80) output )
AS
BEGIN
select @nombre=nombre_alumno,@apell=apellido_alumno from Alumno where carnet=@car
END;

Es la única manera que he podido obtener los parámetros de salida en Qt, si alguien sabe una mejor manera que nos lo comparta, jejeje.

Espero que les sirva. =0)

Anuncios
10
Jun
08

QT4 y SQLite

SQLite es una pequeña librería multiplataforma escrita en C que contiene un sistema gestor de bases de datos. SQLite no trabaja como las usuales Bases de Datos, con infraestructura cliente/servidor, en cambio SQLite se integra directamente en la aplicación utilizando un archivo para guardar la información.

SQLite puede utilizarse para guardar datos que no requieran gran cantidad de datos como configuraciones, logs, historiales, etc. Actualmente SQLite 3 soporta hasta 2 Terabytes, pero hay que tener en cuenta que SQLite consume al rededor de 256 bytes de memoria por cada 1 MiB de la base de datos.

Qt4 provee integración directa con SQLite, la conexión es bastante sencilla, tanto que es difícil encontrar información sobre el tema :).

Activando SQLite

Lo primero es crear un proyecto de QT4 ya sea usando KDevelop, QDevelop o generándolo uno mismo.

Dentro de KDevelop tenemos que ir a Opciones del Sub Proyecto -> Configuración

QT4 y SQLite

En QDevelop debemos ir al menú Proyecto -> propiedades del proyecto y buscar la opción Bibliotecas Qt

QDevelop y SQLite

En ambos debemos seleccionar las librerías SQL.

Si es un proyecto echo sin una IDE se puede añadir al archivo .pro la variable

QT += sql

Conexión a SQLite

La conexión es de las mas sencillas, no se colocara host ni contraseña, solamente el nombre del archivo que se utilizará para guardar los datos:

#include <QSqlDatabase>

QSqlDatabase baseDatos = QSqlDatabase::addDatabase(“QSQLITE”);

baseDatos.setDatabaseName(“bd.db”);

Si Qt no encuentra el archivo creará uno.

De ahora en adelanta ya podemos utilizar SQLite como si fuese cualquier base de datos, teniendo en cuenta las sentencias que soporta.

Creando la estructura de la Base de Datos

Para crear la estructura de la Base de Datos podemos utilizar una interface como SQLite Data Base Browser o phSQliteAdmin, o bien hacerlo mediante su interfáz de consola:

Creamos una tabla dentro de la base de datos con sus respectivos campos

$ sqlite3 bd.db
SQLite version 3.5.6
Enter “.help” for instructions
sqlite> CREATE TABLE usuarios (
…> id INTEGER PRIMARY KEY,
…> usuario TEXT,
…> clave TEXT);

Podemos verificar lo creado con la instrucción .schema

sqlite> .schema usuarios
CREATE TABLE usuarios (
id INTEGER PRIMARY KEY,
usuario TEXT,
clave TEXT);

También podemos ingresar un dato de prueba para nuestro programa y verificar que se ha insertado correctamente.

sqlite> INSERT INTO usuarios (usuario, clave) VALUES (‘administrador’, ‘administrador’);
sqlite> SELECT * FROM usuarios;
1|administrador|administrador

Para salir utilizamos la instrucción .exit

sqlite> .exit

Ejemplo de utilizacion

Para ejemplo pueden descargar el archivo ejemplo.tar.gz el cual trae un ejemplo minimo de como acceder y leer los datos de una base de datos SQLite con QT4 configurado tanto para compilarse en Linux como en Windows

Enlaces:
SQLite -> SQLite Home Page
Documentacion de SQLite -> http://www.sqlite.org/docs.html
QT4 -> http://trolltech.com/products/qt/




CGSOL 2008

Publicidad CGSOL 2008