2012-06-01 6 views
11

Estoy tratando de crear una base de datos en C++ usando sqlite3 lib .. estoy consiguiendo error sqlite3_prepare_v2'
no fue declarado en este ámbito
como se muestra en Logcat.C++: Crear base de datos con SQLite para la inserción y actualización

archivo de registro

..\src\Test.cpp: In function 'int main(int, const char**)': 
..\src\Test.cpp:21:85: error: 'sqlite3_prepare_v2' was not declared in this scope 
..\src\Test.cpp:30:13: error: variable 'sqlite3 in' has initializer but incomplete type 
..\src\Test.cpp:30:30: error: invalid use of incomplete type 'sqlite3 {aka struct sqlite3}' 
..\src\/sqlite3.h:73:16: error: forward declaration of 'sqlite3 {aka struct sqlite3}' 

Aquí está mi código

#include <iostream> 
using namespace std; 
#include "sqlite3.h" 

int main (int argc, const char * argv[]) { 

sqlite3 *db; 
sqlite3_open("test.db", & db); 

    string createQuery = "CREATE TABLE IF NOT EXISTS items (busid INTEGER PRIMARY KEY, ipaddr TEXT, time TEXT NOT NULL DEFAULT (NOW()));"; 
    sqlite3_stmt *createStmt; 
    cout << "Creating Table Statement" << endl; 
    sqlite3_prepare_v2(db, createQuery.c_str(), createQuery.size(), &createStmt, NULL); 
    cout << "Stepping Table Statement" << endl; 
    if (sqlite3_step(createStmt) != SQLITE_DONE) cout << "Didn't Create Table!" << endl; 

    string insertQuery = "INSERT INTO items (time, ipaddr) VALUES ('test', '192.168.1.1');"; // WORKS! 


    sqlite3_stmt *insertStmt; 
    cout << "Creating Insert Statement" << endl; 
    sqlite3_prepare(db, insertQuery.c_str(), insertQuery.size(), &insertStmt, NULL); 
    cout << "Stepping Insert Statement" << endl; 
    if (sqlite3_step(insertStmt) != SQLITE_DONE) cout << "Didn't Insert Item!" << endl; 

cout << "Success!" << endl; 

return 0; 
} 

favor me ayude. gracias .....

Respuesta

16
#include <sqlite3.h> 

debe contener sqlite3_prepare_v2 y sqlite3 estructura. Asegúrese de incluir el archivo sqlite3.h correcto.

También en sqlite3_prepare_v2 el 3er arg puede ser (y debería ser en su caso) -1 por lo que el sql se lee con el primer terminador nulo.

Trabajando muestra de bare-metal utilizando SQLite 3.7.11:

#include <sqlite3.h> 
int test() 
{ 
    sqlite3* pDb = NULL; 
    sqlite3_stmt* query = NULL; 
    int ret = 0; 
    do // avoid nested if's 
    { 
     // initialize engine 
     if (SQLITE_OK != (ret = sqlite3_initialize())) 
     { 
      printf("Failed to initialize library: %d\n", ret); 
      break; 
     } 
     // open connection to a DB 
     if (SQLITE_OK != (ret = sqlite3_open_v2("test.db", &pDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL))) 
     { 
      printf("Failed to open conn: %d\n", ret); 
      break; 
     } 
     // prepare the statement 
     if (SQLITE_OK != (ret = sqlite3_prepare_v2(pDb, "SELECT 2012", -1, &query, NULL))) 
     { 
      printf("Failed to prepare insert: %d, %s\n", ret, sqlite3_errmsg(pDb)); 
      break; 
     } 
     // step to 1st row of data 
     if (SQLITE_ROW != (ret = sqlite3_step(query))) // see documentation, this can return more values as success 
     { 
      printf("Failed to step: %d, %s\n", ret, sqlite3_errmsg(pDb)); 
      break; 
     } 
     // ... and print the value of column 0 (expect 2012 here) 
     printf("Value from sqlite: %s", sqlite3_column_text(query, 0));  

    } while (false); 
    // cleanup 
    if (NULL != query) sqlite3_finalize(query); 
    if (NULL != pDb) sqlite3_close(pDb); 
    sqlite3_shutdown(); 
    return ret; 
} 

Esperanza esto ayuda

+1

gracias cristian .. – Satyam

+0

muy útil para nosotros thnx buddy ... –

+0

Aquí. base de datos abierta ... pero necesito crear la base de datos –

1

vaya a través de this enlace. No estoy seguro. Podría ayudarte.

creo que su no hay sqlite3_prepare_v2 en lib sqlite3.h, así que pruebe esta .. sqlite3_prepare_v2 puede ser reemplazado por sqlite3_prepare, pero se necesita más atención, ya que cambia la semántica de las llamadas posteriores ligeramente.

+1

mi placer .... :) –

4

Guys, la creación de base de datos utilizando sqlite3 en C/C++, aquí estoy usando los pasos siguientes aparatos .. .

1) Firstly you include MinGw file . 
2) Add header file sqlite3.h, sqlite3.c in your src folder. 
3) Add libr folder , in libr here include these file 

    mysqlite.h, shell.c, sqlite3.c, sqlite3.h, sqlite3ext.h 

Después de entonces iniciar su codificación ...

 #include <iostream> 
using namespace std; 
#include "sqlite3.h" 

int main (int argc, const char * argv[]) { 

    sqlite3 *db; 
    sqlite3_open("test1.db", & db); 

    string createQuery = "CREATE TABLE IF NOT EXISTS items (userid INTEGER PRIMARY KEY, ipaddr 
     TEXT,username TEXT,useradd TEXT,userphone INTEGER,age INTEGER, " 
                "time TEXT NOT NULL DEFAULT 
                      (NOW()));"; 
    sqlite3_stmt *createStmt; 
    cout << "Creating Table Statement" << endl; 
    sqlite3_prepare(db, createQuery.c_str(), createQuery.size(), &createStmt, NULL); 
    cout << "Stepping Table Statement" << endl; 
    if (sqlite3_step(createStmt) != SQLITE_DONE) cout << "Didn't Create Table!" << endl; 

    string insertQuery = "INSERT INTO items (time, ipaddr,username,useradd,userphone,age) 
     VALUES ('7:30', '192.187.27.55','vivekanand','kolkatta','04456823948',74);"; // WORKS! 
    sqlite3_stmt *insertStmt; 
    cout << "Creating Insert Statement" << endl; 
    sqlite3_prepare(db, insertQuery.c_str(), insertQuery.size(), &insertStmt, NULL); 
    cout << "Stepping Insert Statement" << endl; 
    if (sqlite3_step(insertStmt) != SQLITE_DONE) cout << "Didn't Insert Item!" << endl; 



     return 0; 
    } 
+0

Respuesta increíble. Muchas gracias amigo! :-) –

+0

En lugar de mantener parte de los valores de la consulta de inserción como texto estático, podría ser bueno si actualiza el ejemplo, ya que, después de preparar la declaración, cómo cambiar la parte de los valores dinámicamente ... – phoad

+0

phoad, puede hacer esto usando "¿?" o? 1? 2 etc. dentro de la consulta y luego vinculando los parámetros a una declaración. Consulte http://www.sqlite.org/c3ref/bind_blob.html –

Cuestiones relacionadas