作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试在 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
要从 回调
更新 m_Results
对象,您只需将 context 转换为正确的类型,然后使用它:
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()
,并从回调中调用公共(public)类成员:
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);
关于C++ MFC SQLite sqlite3_exec 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38825480/
编写以下程序后,它似乎没有将参数传递给被调用的应用程序。研究时_spawnv以及它能做什么,_execvp被认为是一个合适的替代方案。有谁在源代码中看到问题并知道需要做什么来解决它? #include
在 C++ Windows 控制台程序中使用 _execv() 函数时,我发现参数以空格分隔,每个子字符串在执行程序的参数列表中成为一个单独的参数。据推测,直到找到该程序后才会发生这种情况,因为即使程
我是一名优秀的程序员,十分优秀!