Как создать локальную базу данных в проекте Microsoft Visual C++ 2010 Express?

Как создать локальную базу данных в проекте Microsoft Visual C++ 2010 Express?

Извините, но я не могу найти этот простой ответ в Интернете. Единственный ответ, который я нашел, для Visual Studio: использование проекта> добавить новый элемент> локальная база данных. Но этот параметр недоступен в выпуске Visual C++ 2010 Express.

Я попытался установить «Microsoft SQL Server Compact 4» и «Microsoft SQL Server Denali» и обновить «Microsoft Visual C++ 2010 Express» из «Центра обновления Windows».


person Leopoldo Sanczyk    schedule 22.09.2011    source источник
comment
У MSVC раньше были проекты dbase. Все удалено вокруг VS2008, почти никто не пишет код dbase на C++. Не многие пользователи это заметили, поддержки IDE всегда не хватало.   -  person Hans Passant    schedule 23.09.2011


Ответы (1)


Хорошо, наконец-то я нашел решение. К сожалению, я должен ответить на свой вопрос...

Я использовал библиотеку SQLite (http://www.sqlite.org/). Это было немного сложно, потому что документация sqlite немного расплывчата, но я сделал следующее:

  • Загрузите sqlitedll*.zip — извлеките куда-нибудь файлы .def и .dll.
  • Создайте файл lib с помощью такой команды, как «c:\program files\micros~1\vc98\bin\lib» /def:sqlite3.def». Сделайте это из командной строки в каталоге с файлом .def, с соответствующим путем к вашему lib.exe. Возможно, вам придется сначала запустить vcvars32.bat, который также находится в каталоге bin. Скопируйте полученный .lib в соответствующее место и установите его как каталог библиотеки в VC++. (Или делать это на основе каждого проекта.)
  • Загрузите файл sqlite-source*.zip и извлеките файл sqlite3.h из него в подходящий каталог. Установите это как включаемый каталог в VC++. (Опять же, вы можете сделать это для каждого проекта отдельно.)
  • В вашем проекте #include по мере необходимости добавьте sqlite3.lib в свой проект, скопируйте sqlite3.dll в каталог исполняемого файла или рабочий каталог, и вы должны быть готовы к работе.

Затем легко использовать запросы без вывода, но если вы хотите использовать, например, SQL «SELECT», вы можете использовать этот код:

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);

Я ожидаю, что эта информация будет полезной!

Источники:

person Leopoldo Sanczyk    schedule 06.10.2011