【问题标题】:C++ and sqlite3- sqlite3_prepare_v2 is not workingC++ 和 sqlite3- sqlite3_prepare_v2 不工作
【发布时间】:2014-07-08 06:24:58
【问题描述】:

我将 sqlite3 与 C++ 一起使用。但问题是,当我调试代码时,我意识到它没有,我的意思是sqlite3_prepare_v2 没有从数据库中提取数据。

当我打印它提取的值时,它打印了一些垃圾值。同时,我注意到以下警告:

警告 4 警告 LNK4248:未解析的 typeref 令牌 (01000028) 'sqlite3_stmt';图像可能无法运行。

我正在开发 MS Visual Studio 2010 Windows 窗体应用程序。

谁能帮忙?

【问题讨论】:

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


    【解决方案1】:

    我认为链接器投诉没问题。见http://social.msdn.microsoft.com/Forums/en-US/8376b2f0-cc36-48c8-9021-f30bda41f410/linker-warning-lnk4248-possible-problem

    以下内容没有考虑到您正在使用 MS 管理的 C++ 进行编程,但是,我希望它仍能提供一些指导。

    sqlite3_prepare_v2 准备语句,但执行任何操作。 您需要调用 sqlite3_step 来执行(或部分执行)SQL。

    对于不返回任何内容的 SQL 语句(例如 UPDATE、DELETE、INSERT),您调用 sqlite3_step 一次,如果有效,它应该返回 SQLITE_DONE。

    对于可以返回多行的语句,您可以重复调用 sqlite3_step。每次返回代码为 SQLITE_ROW 时,您都会返回一行数据,您可以使用 sqlite3_column_* 语句集。当返回所有数据时,sqlite3_step 返回 SQLITE_DONE。

    代码可能看起来像这样

    sqlite3* db;
    int rc = sqlite3_open(databasePath.c_str(), &db);
    std::string sql = "SELECT Id, Url FROM Url WHERE Page_Download_Reqd <> 0;";
    
    sqlite3_stmt* statementPtr;
    const char* tailPtr;
    int rc = sqlite3_prepare_v2(db, sql.c_str(), sql.size(), &statementPtr, &tailPtr);
    
    bool finished = false;
    do {
        int rc = sqlite3_step(statementPtr);
        switch (rc) {
            case SQLITE_ROW: {
                __int64 id = sqlite3_column_int(statementPtr, 0);
                std::string url = reinterpret_cast<const char*>(sqlite3_column_text(statementPtr, 1));
                // Do something with your data
            }
            break;
            case SQLITE_DONE:
                finished = true;
                break;
            default:
                assert(false);
        }
    } while (!finished);
    

    如果你的 SQL 中有变量,例如

    SELECT Id, Url FROM Url WHERE Count <> :count;
    

    那么您需要在 sqlite3_prepare_v2 和 sqlite3_step 函数之间使用 sqlite3_bind_* 函数之一。例如

    __int count = 6;
    std::string bindVarName = ":count";
    rc = sqlite3_bind_int(
        statementPtr, 
        sqlite3_bind_parameter_index(statementPtr, bindVarName.c_str()), 
        count);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多