Programación General > C/C++

 C++ y SQL

(1/3) > >>

lydia_watanabe:
Hola a todos

Estoy trabajando en una aplicación en c++ (trabajando en Linux), la cual tiene que conectar a una base de datos (BD) usando SQLite3. La BD está creada, ahora mi problema es que no sé que librería debo incluir para poder trabajar con ella.

Según un ejemplo que he encontrado era tan sencillo como poner


--- Código: C++ ---#include "sqlite3.h" 
o también


--- Código: C++ ---#include <sqlite3.h> 
Pero al compilar me da el típico error de que no existe


--- Código: Text ---sqlite3.h: No existe el fichero ó directorio 
¿Alguien tiene idea de como puedo incluir la librería? Muchas gracias

EI: juntando mensajes.

Problema solucionado, hay que instalar libsqlite3-dev que me faltaba.

lydia_watanabe:
Más problemas (cómo era de esperar).

Téngo un código sencillo y totalmente estúpido de prueba:


--- Código: C++ ---#include <stdio.h>#include <sqlite3.h> int main(int argc, char*argv[]){    sqlite3* db;   sqlite3_open("bd/prueba.bd", &db);   if (sqlite3_errcode(db) != 0)      printf("%sn",sqlite3_errmsg(db));   sqlite3_close(db);} 
Nada del otro mundo, conecta con la BD, comprueba errores y cierra, pero me falla.


--- Código: Text ---bd.C:(.text+0xa0): undefined reference to `sqlite3_open'bd.C:(.text+0xab): undefined reference to `sqlite3_errcode'bd.C:(.text+0xbf): undefined reference to `sqlite3_errmsg'bd.C:(.text+0xd2): undefined reference to `sqlite3_close' 
No sé si tengo que incluir alguna otra librería en el código (que se supone que no) o si se debe a otra cosa (que será lo más probable).

Actualizado.- Despues de ponerme a investigar un poquillo más en profundida, descubrí que el problema estaba al compilar


--- Código: Text ---g++ -lsqlite3 bd.C 
Espero que mis dudas y mis propias respuestas les sirvan a otros también

lydia_watanabe:
Dos nuevas preguntas, una es más de SQLite y la otra más de C++, pero ojalá que alguien me las sepa contestar.

Siguiendo un sencillo ejemplo de la página oficial de SQLite donde se muestra de forma muy básica como se conecta una BD, se hace una consultas y se cierra la conexión, he creado consulta simple en la que se busca en la BD un nombre de usuario y una clave introducidos al ejecutar el programa y se muestra el Identificador y el tipo de usuario.


--- Código: C++ ---/**************************************************************************/int Callback(void *NotUsed, int argc, char **argv, char **azColName){    cout << "Ident = " << argv[0] << "     TypeUser = " << argv[3] << endl;   return 0;} /**************************************************************************/Users::Users(string name, string pass){   sqlite3* db;   char *zErrMsg = 0;    sqlite3_open("bd/project.bd", &db);   if (sqlite3_errcode(db)!=0){      cout << sqlite3_errmsg(db) << endl << endl;      sqlite3_close(db);      exit(1);   }    string select = "SELECT * FROM user WHERE username='" + name + "' and userpass='" + pass + "'";   int rc = sqlite3_exec(db, select.c_str(), Callback, 0, &zErrMsg);   if (rc != SQLITE_OK){      fprintf(stderr, "SQL error: %sn", zErrMsg);      sqlite3_free(zErrMsg);   }    sqlite3_close(db);} 
Problema 1
Cuando lo ejecuto funciona perfectamente. Si existe el usuario, se muestra y si no existe no, el problema es si quiero hacer algo en especal cuando este usuario no existe, pues aparentemente no hay ningún tipo de variable o función que me lo indique, pero por lógica debería de haberla. ¿Existe alguna manera de saber si se han obtenido valores o no en la consulta?

Problema 2
Estoy trabajando con clases y por tanto me interesaría que la función Callback fuera un miembro de la clase para poder manejar ciertos datos, pero al compilar me da el siguiente error:


--- Código: Text ---error: el argumento de tipo ‘int (Users::)(void*, int, char**, char**)’ no coincide con ‘int (*)(void*, int, char**, char**)’ 
¿Hay alguna manera de que la función pertenezca a la clase?

Eternal Idol:
Para el problema 1 consulta la documentacion, yo lo hice y no me parecio ver nada util.

Para el problema 2 tenes que hacer la funcion estatica, no tiene this y por eso justamente existe el parametro del callback que nombraste NotUsed, ahi le tenes que pasar el puntero del objeto, despues dentro del callback haces un cast y listo.

lydia_watanabe:
Eternal Idol gracias por responder.

Con respecto al problema 1, la verdad es que consulté la documentación, pero no vi nada, sin embargo, podría ser que estuviera en alguna parte y que a mi se me hubiese pasado.

Con respecto al problema 2, entiendo lo que me dices, pero no tengo ni idea de como se hace. Nunca he usado el puntero this y estoy un poco perdida. Así pues ¿que modificaciones debería hacer si mi código de partida es este y como debería trabajar con sus parámetros?


--- Código: C++ ---static int Users::Callback(void *NotUsed, int argc, char **argv, char **azColName){     cout << "Ident = " << argv[0] << "     TypeUser = " << argv[3] << endl;   return 0;} 
Gracias

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa