Тема: База даних SQLite і C++.

Привіт всім. Підкажіть, будь-ласка, як підключити базу даних SQLite до консольного додатку в C++.

2

Re: База даних SQLite і C++.

Gcc компілятор ?
Що за ОС ?

3

Re: База даних SQLite і C++.

Microsoft Visual Studio 2019. Операційна система Windows 10.

4 Востаннє редагувалося varkon (25.10.2019 15:49:27)

Re: База даних SQLite і C++.

Підключити .h та .с файли sqlite після чого створюєте свою функцію та пишете туди щось на кшалт:

int WriterIfcProperty::writeDb()
{
 const char* CREATE_AUXILIARY_CONTAINER_INFO = "DROP TABLE IF EXISTS AuxiliaryContainerInfo; " \
        "CREATE TABLE AuxiliaryContainerInfo (" \
        "container_id INTEGER PRIMARY KEY," \
        "element_id INTEGER," \
        "metadata_container_id INTEGER," \
       /* " FOREIGN KEY(metadata_container_id) REFERENCES metadata_container(id) " \ */
        "); ";
 boost::filesystem::path path = "D:/tmp/";
    path.append("passthrough.db");
sqlite3 *db;
    int rc;
    char *zErrMsg = 0;

    rc = sqlite3_open_v2(path.string().c_str(), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
    if (rc || NULL == db)
    {
        Data::enterLog(LOG_ERROR, std::string("Unable to open ") + path.string() + ": " + sqlite3_errmsg(db));
        sqlite3_close(db);
        return 0;
    }

    // Options for improved write performance. We're always writing a new DB that's not useful in the event
    // of a pipe crash, so we don't have a need for writing to disk as we go.
    // Well-documented at: https://www.sqlite.org/pragma.html
    sqlite3_exec(db, "PRAGMA journal_mode = OFF", nullptr, nullptr, &zErrMsg);
    sqlite3_exec(db, "PRAGMA synchronous = OFF", nullptr, nullptr, &zErrMsg);
    sqlite3_exec(db, "PRAGMA locking_mode = EXCLUSIVE", nullptr, nullptr, &zErrMsg);

    const char* startTransaction = "BEGIN TRANSACTION;";
    const char* endTransaction = "END TRANSACTION;";
    rc = sqlite3_exec(db, startTransaction, callback, 0, &zErrMsg);
    if (rc)
    {
        Data::enterLog(LOG_ERROR, std::string("Unable to start transaction on ") + path.string() + ": " + sqlite3_errmsg(db));
        sqlite3_close(db);
        return rc;
    }
    rc = sqlite3_exec(db,CREATE_AUXILIARY_CONTAINER_INFO, callback, nullptr, &zErrMsg);
    if (rc != SQLITE_OK)
    {
        Data::enterLog(LOG_ERROR, std::string("Unable to create  parameter group table ") + path.string() + ": " + sqlite3_errmsg(db));
        sqlite3_close(db);
        return rc;
    }
 const char* insertStmt = "insert into AuxiliaryContainerInfo values(?,?,?);";
    sqlite3_stmt* meshStmt = 0;
    const char* pzTail = 0;
    const std::string name = "My name";
int index = 0;
    int nsize = (int)name.size();
    rc = sqlite3_prepare_v2(db, insertStmt, (int)strlen(insertStmt), &meshStmt, &pzTail);
    sqlite3_bind_int(meshStmt, 1, index);
    sqlite3_bind_text(meshStmt, 2, name.c_str(), nsize, 0);
    sqlite3_bind_int(meshStmt, 3, index);
    rc = sqlite3_step(meshStmt);
    if (rc == SQLITE_DONE)
    {        
    sqlite3_reset(meshStmt);
    rc = sqlite3_finalize(meshStmt);

    if (rc != SQLITE_OK)
    {
        logErrorForSQLStatement(db, "writeGeometryBinDb sqlite3_finalize", NULL, rc);
        
    }
}
rc = sqlite3_exec(db, endTransaction, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK)
    {
        Data::enterLog(LOG_ERROR, std::string("Unable to end transaction on ") + path.string() + ": " + sqlite3_errmsg(db));
    }
    rc = sqlite3_close_v2(db);
    if (rc != SQLITE_OK)
    {
        Data::enterLog(LOG_ERROR, std::string("Unable to close ") + path.string() + ": " + sqlite3_errmsg(db));
    }
    return rc;
}

Приклад створює БД якщо вона не існує, створює таблицю з іменем AuxiliaryContainerInfo починає транзакцію, записує рядок з трьох параметрів та завершує транзакцію.