打开数据库功能需要返回db对象,否则它不起作用?

时间:2019-05-03 14:01:08

标签: c sqlite

我在c中使用sqlite3,并创建了一个名为open_database的函数,没有返回类型:

void open_database(const char* database_name, sqlite3* db)

它所做的就是打开数据库:

Doesnt work: 

void open_database(const char* database_name, sqlite3* db) {

    int return_code;

    return_code = sqlite3_open(database_name, &db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
    }
}


Works:

sqlite3* open_database(const char* database_name, sqlite3* db) {
    int return_code;

    return_code = sqlite3_open(database_name, &db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
        return db;
    }
}

问题是当我然后调用该函数并尝试在其他地方使用它时,它失败并显示NULL错误类型? (sqlite错误:(null))。但是,如果我将其从void更改为sqlite3并返回db对象,它将起作用吗?

sqlite3* db;


Works: 

db = open_database("test_db", db);
create_table(db);
insert_into_table(db);
close_database(db);


Doesnt work: 

open_database("test_db", db);
create_table(db);
insert_into_table(db);
close_database(db);

我尝试搜索文档和其他区域,但没有找到原因。对于为什么会发生这种情况的任何见解都会很棒。谢谢。

额外:

这里是使用数据库的功能之一:

void create_table(sqlite3* db) {

    char* sql;
    char *zErrMsg = NULL;
    int return_code;

    /* Create SQL statement */
    sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );";

    //printf("First Statement: %s\n", sql);

   /* Execute SQL statement */
   return_code = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);

   if( return_code != SQLITE_OK ){

      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      //printf("Error creating table.\n");
      sqlite3_free(zErrMsg);

   } else {
      fprintf(stdout, "Table created successfully\n");
   }

}

1 个答案:

答案 0 :(得分:2)

类似于this question,当传入指针然后尝试通过调用sqlite3_open()对其进行修改时,您正在修改该函数本地的该指针的副本。如果退回,您将取回您的更改。

如果您希望它返回void,请尝试这样定义它...

void open_database(const char* database_name, sqlite3** db) {

    int return_code;

    return_code = sqlite3_open(database_name, db);

    if(return_code) {
        printf("Issue opening database\n");
        exit(1);
    } else {
        printf("Datbase Opened.\n");
    }
}

并这样称呼它

sqlite3* db;
open_database("test_db", &db);