Нужна помощь в открытии базы данных sqlite3 в C - PullRequest
0 голосов
/ 03 сентября 2018

Итак, я не программист по профессии, однако, мне была поручена программа, которая опрашивает индикатор по протоколу Modbus, а затем записывает информацию в базу данных. Однако я смог заставить его работать, пытаясь уточнить мой код и сделать так, чтобы основные части программы (открытое соединение Modbus, запись в базу данных, открытие / создание базы данных) были функциями, вызываемыми во время основного цикл, я столкнулся с проблемой при открытии базы данных. Когда я вызываю функцию, я получаю нулевые значения, когда печатаю значение rc, как при открытии базы данных, так и при создании частей кода в таблице.

Так было до того, как я попытался очистить код и сделать все это, вызвав функцию:

int main(int argc, char*argv[]){
    sqlite3 *db;
//open database
int rc = sqlite3_open(db_name, &db);
if (rc != SQLITE_OK){
    fprintf(stderr, "Cannot open database: %s\n",
    sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
}
char sql_query[1024];
// create sqlite table
snprintf(sql_query,sizeof(sql_query), "CREATE TABLE IF NOT EXISTS %s(%s INTEGER PRIMARY KEY,%s TEXT NOT NULL, %s TEXT NOT NULL, %s TEXT NOT NULL,%s REAL NOT NULL, %s REAL NOT NULL, %s REAL NOT NULL);",tbl_id1,tbl_col1,tbl_col2,tbl_col3,tbl_col4,tbl_col5,tbl_col6,tbl_col7);
rc = sqlite3_exec(db, sql_query, callback, 0, NULL);

if (rc != SQLITE_OK ){
    fprintf(stderr, "Failed to select data\n");
    fprintf(stderr, "SQL error: %s\n", NULL);

    sqlite3_free(NULL);
    sqlite3_close(db);

    return 1;
}

У меня нет проблем с его запуском, и функция, которую я пытаюсь использовать, - это тот же код, заключенный в

void open_Database(db){//sqlite code}

Вызов функции:

open_Database(db) (same db declared in the main routine)

1 Ответ

0 голосов
/ 04 сентября 2018

Возможно, вы упустили тот факт, что sqlite3_open() нужен указатель на переменную, указывающую на объект sqlite3. В своем исходном коде вы объявили указатель на такой объект и передали адрес этого указателя функции open.

Когда вы объявляете подфункцию, выполняющую эту работу, вы должны также дать ей указатель-указатель:

void open_database (sqlite3 **db)
{
   int rc;
   rc = sqlite3_open(db_name, db);
   // ... now do error checking
}

И не забывайте не добавлять этот амперсанд для разыменования перед параметром db в вызове sqlite3_open()!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...