2011-09-22 14 views
7

¿Cómo puedo crear una base de datos local dentro de un proyecto Microsoft Visual C++ 2010 Express?¿Cómo puedo crear una base de datos local dentro de un proyecto Microsoft Visual C++ 2010 Express?

Lo siento, pero no puedo encontrar esta respuesta simple en la web. La única respuesta que he encontrado es para Visual Studio: usando project> add new item> local database. Pero esta opción no está disponible en Visual C++ 2010 Express edition.

He intentado instalar "Microsoft SQL Server Compact 4" y "Microsoft SQL Server Denali", y la actualización de "Microsoft Visual C++ 2010 Express" de "Windows Update".

+0

MSVC solían tener proyectos dbase. Todo eliminado en VS2008, casi nadie escribe el código dbase en C++. No muchos usuarios se dieron cuenta, el soporte de IDE siempre faltaba de todos modos. –

Respuesta

7

Ok, tengo una solución al fin. Lamentablemente debo responder a mi propia pregunta ...

Solía ​​librería SQLite (http://www.sqlite.org/). Fue un poco complicado porque la documentación SQLite es un poco vago, pero lo hice de la siguiente manera:

  • Descargar sqlitedll * .zip - extraer .def y .dll en alguna parte.
  • Genere el archivo lib con un comando como "c: \ program files \ micros ~ 1 \ vc98 \ bin \ lib" /def:sqlite3.def ". Haga eso desde un comando , en el directorio con el .def archivo en, con la ruta adecuada a su lib.exe. es posible que tenga que ejecutar vcvars32.bat primera, que es también en el directorio bin. Copia el .lib resultante a un lugar apropiado , y establece que a medida un directorio de biblioteca en VC++. (O hágalo en un por proyecto)
  • Descargue el archivo sqlite-source * .zip y extraiga el archivo sqlite3.h desde dentro de un directorio adecuado. un directorio de inclusión en VC++. (De nuevo, lo puedes hacer por proyecto.)
  • En tu proyecto, #include según sea necesario, agrega sqlite3.lib a tu proyecto, copia el archivo sqlite3.dll al directorio de tu ejecutable o directorio de trabajo, y deberías estar listo para ir.

Entonces, es fácil de usar no-cabo consultas, pero si desea utilizar un SQL "SELECT", por ejemplo, podría utilizar este código:

std::string queries; 
// A prepered statement for fetching tables 
sqlite3_stmt *stmt; 
// Create a handle for database connection, create a pointer to sqlite3 
sqlite3 *handle; 
// try to create the database. If it doesnt exist, it would be created 
// pass a pointer to the pointer to sqlite3, in short sqlite3** 
int retval = sqlite3_open("local.db",&handle); 
// If connection failed, handle returns NULL 
if(retval){ 
    System::Windows::Forms::MessageBox::Show("Database connection failed"); 
    return; 
}  
// Create the SQL query for creating a table 
char create_table[100] = "CREATE TABLE IF NOT EXISTS users (uname TEXT PRIMARY KEY,pass TEXT NOT NULL,activated INTEGER)"; 
// Execute the query for creating the table 
retval = sqlite3_exec(handle,create_table,0,0,0); 
// Insert first row and second row 
queries = "INSERT INTO users VALUES('manish','manish',1)"; 
retval = sqlite3_exec(handle,queries.c_str(),0,0,0); 
queries = "INSERT INTO users VALUES('mehul','pulsar',0)"; 
retval = sqlite3_exec(handle,queries.c_str(),0,0,0); 
// select those rows from the table 
queries = "SELECT * from users"; 
retval = sqlite3_prepare_v2(handle,queries.c_str(),-1,&stmt,0); 
if(retval){ 
    System::Windows::Forms::MessageBox::Show("Selecting data from DB Failed"); 
    return ; 
} 
// Read the number of rows fetched 
int cols = sqlite3_column_count(stmt); 
while(1){ 
    // fetch a row’s status 
    retval = sqlite3_step(stmt); 
    if(retval == SQLITE_ROW){ 
    // SQLITE_ROW means fetched a row 
    // sqlite3_column_text returns a const void* , typecast it to const char* 
     for(int col=0 ; col<cols;col++){ 
      const char *val = (const char*)sqlite3_column_text(stmt,col); 
      System::Windows::Forms::MessageBox::Show(stdstr2systemstr(sqlite3_column_name(stmt,col))+" = "+stdstr2systemstr(val)); 
     } 
    } 
    else 
    if(retval == SQLITE_DONE){ 
      // All rows finished 
      System::Windows::Forms::MessageBox::Show("All rows fetched"); 
      break; 
     } 
     else{ 
      // Some error encountered 
      System::Windows::Forms::MessageBox::Show("Some error encountered"); 
      return ; 
     } 
    } 
    // Close the handle to free memory 
    sqlite3_close(handle); 

espero que esta información ¡sé útil!

Fuentes:

Cuestiones relacionadas