C ++和sqlite3-sqlite3_prepare_v2无效

时间:2014-07-07 00:46:25

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

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

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

  

警告4警告LNK4248:未解析的typeref标记(01000028)   ' sqlite3_stmt&#39 ;;图像可能无法运行。

我正在使用MS visual studio 2010 Windows窗体应用程序。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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);