在visual c ++中使用sqlite3

时间:2015-09-16 21:39:19

标签: c++ visual-studio visual-c++ sqlite

我正在使用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;
}

我尝试更改函数参数来修复它但没有任何效果。

1 个答案:

答案 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 );