我在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");
}
}
答案 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);