我在一个需要执行select查询的项目中工作(我使用sqlite作为sql引擎)并将结果加载到QTextEdit中(我使用QT作为我的图形界面)。
现在我只写了下面的代码(但我坚持在需要将结果附加到QTextEdit的部分):
//Callback function to print the query to the console
int db_files::CallBack(void *notUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i<argc; i++) {
printf("%s : %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
std::cout << "\n";
return 0;
}
//Function where I open the database and run the query
void custHandler::show_all() {
rc = sqlite3_open("database.db", &db);
if(rc != SQLITE_OK) {
sqlite3_close(db);
exit(1);
}
sqlCust = "SELECT * FROM DB";
rc = sqlite3_exec(db, sqlCust, CallBack, 0, &ErrMsg);
if (rc != SQLITE_OK) {
exit(1);
}
sqlite3_free(ErrMsg);
sqlite3_close(db);
}
也许我需要在回调功能中操作,但我不知道......有人可以向我解释一下吗?
编辑:
我有一个名为txtShow的QTextEdit变量,我通常通过ui->txtShow.insertPlainText("text");
访问它
答案 0 :(得分:1)
请参阅SqlLite documentation中的sqlite3_exec()
函数概要:
int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ );
如您所见,第4个参数是用户定义的参数,该参数将传递给callback()
函数。
因此,您需要使用它与您的调用代码进行交互:
//Callback function to print the query to the console
int db_files::CallBack(void *myQTextEdit, int argc, char **argv, char **azColName) {
QTextEdit* qTextEdit = (QTextEdit*)myQTextEdit;
for(int i = 0; i<argc; i++) {
// Add the results to qTextEdit as needed ...
}
return 0;
}
调用sqlite3_exec()
函数时,传递:
//Function where I open the database and run the query
void custHandler::show_all() {
rc = sqlite3_open("database.db", &db);
if(rc != SQLITE_OK) {
sqlite3_close(db);
exit(1);
}
sqlCust = "SELECT * FROM DB";
rc = sqlite3_exec(db, sqlCust, CallBack, &myQTextEdit, &ErrMsg);
// ^^^^^^^^^^^^
if (rc != SQLITE_OK) {
exit(1);
}
sqlite3_free(ErrMsg);
sqlite3_close(db);
}
这是C风格的API在回调函数中与用户代码交互的一种非常常见的方式。