[英]C++ MFC SQLite sqlite3_exec callback
因此,我嘗試在Visual Studio 2010中將SQLite與MFC對話框一起使用。我不清楚如何使用回調函數來保存查詢結果,該查詢試圖計算數據庫中的表數,放入變量m_Results。 無論如何,還是我可以訪問nTables變量?
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
fprintf(stderr, "%s: ", (const char*)data);
data = argv[0];
return 0;
}
BOOL CDBpracticeDlg::OnInitDialog(){
...
// TODO: Add extra initialization here
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
rc = sqlite3_open("structInfo_Test.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
/* Create SQL statement */
sql = "Select Count(*) as nTables FROM sqlite_master where type='table';";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, &m_Results, &zErrMsg);
if( rc != SQLITE_OK ){
char error[200];
strcpy(error,"SQL error: ");
strcat(error,zErrMsg);
m_Results = error;
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Operation done successfully\n");
}
UpdateData(FALSE);
sqlite3_close(db);
return TRUE; // return TRUE unless you set the focus to a control
}
sqlite3_exec API的回調記錄不足。 據稱它具有誤導的參數名稱的事實也無濟於事。 提供更自然的形式參數名稱很長的路要走:
static int callback(void* context, // user-provided object (4th param to sqlite3_exec)
int columnCount, // number of columns
char** columnValues, // array of column values as C-style strings
char** columnName) // array of column names as C-style strings
要從callback
更新m_Results
對象,只需將上下文轉換為正確的類型,然后使用該類型:
static int callback(void* context, int columnCount,
char** columnValues, char** columnNames) {
CMyType& results = *static_cast<CMyType*>(context);
// Use 'results' which is a reference to 'm_Results'.
for (int index = 0; index < columnCount; ++index) {
// Assuming CMyType has operator+=(const char*) (like a CString)
results += columnNames[index];
results += ": ";
results += columnValues[index];
}
// Return 0 to continue invoking the callback for the remaining rows in the result
// set. Returning non-zero will terminate the callbacks, and sqlite3_exec()
// returns SQLITE_ABORT.
return 0;
或者,您可以將this
代替&m_Results
給sqlite3_exec()
,並從回調中調用公共類成員:
static int callback(void* context, int columnCount,
char** columnValues, char** columnNames) {
CDBpracticeDlg* obj = static_cast<CDBpracticeDlg*>(context);
// Delegate callback to class member implementation
return obj->MyCallback(columnCount, columnValues, columnNames);
}
...
rc = sqlite3_exec(db, sql, callback, this, nullptr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.