我正在使用visual studio 2015,我想使用sqlite3,我已经设法将sqlite3集成到其中,但我只能通过本机c样式使用它,我不能像使用c ++那样使用sqlite。我的数据库中有一个表测试,其中包含值(id int,id1 int,name string) 例如,这个程序运行良好
*this
该程序的输出为0 0测试 这很好但是当我尝试使用类实现相同的逻辑时我得到错误
func timeRemainingString(finishDate date:NSDate) -> String {
let secondsFromNowToFinish = date.timeIntervalSinceNow
let hours = Int(secondsFromNowToFinish / 3600)
let minutes = Int((secondsFromNowToFinish - Double(hours) * 3600) / 60)
let seconds = Int(secondsFromNowToFinish - Double(hours) * 3600 - Double(minutes) * 60 + 0.5)
return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
我知道在课堂上定义函数是一种不好的做法,但我很着急。它正在给予
void forprinting(string a)
{
cout << a<<"\n";
}
int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
string testing;
string test2;
for (i = 0; i<argc; i++)
{
testing = testing + azColName[i];//irrelevant
test2 += argv[i];
}
forprinting(test2);
printf("\n");
return 0;
}
int main()
{
char *zErrMsg = 0;
sqlite3 *db;
int rc;
rc = sqlite3_open("DATA.db", &db);
char *data;
const char *sql;
sql = "SELECT * FROM test;";
sqlite3_exec(db, sql, callback, 0, &zErrMsg);
sqlite3_close(db);
system("pause");
return 0;
}
我尝试更改函数参数来修复它但没有任何效果。
答案 0 :(得分:0)
此:
sqlite3_exec(db, sql, callback, 0, &zErrMsg);
应该是:
sqlite3_exec(db, sql, &testingSqlite::callback, 0, &zErrMsg);
后者是正确的“成员”语法。如果你可以使用前者,它是非标准的(一些编译器确实允许它)。 也就是说,它不起作用,因为函数签名并不表示它可以是成员函数。
相反,您可以使用参数列表的“void *”。
也就是说,你必须创建像
这样的东西int callback(void *o, int argc, char **argv, char **cname)
{
testingSqlite op* = reinterpret_cast<testingSqlite *>(o);
return op->callback( argc, argv, cname );
}
这意味着你在tesingSqlite中的回调没有采用void *
您还提供c样式回调作为函数指针,而不是您的成员函数。你还必须提供'this'指针作为第4个参数(当它调回你时它变为void *),如:
sqlite3_exec( db, sql, callback, this, &zErrMsg );