我使用sqlite3和C ++。但问题是,当我调试代码时,我意识到它没有,我的意思是sqlite3_prepare_v2
不会从数据库中提取数据。
当我打印它提取的值时,它会打印一些垃圾值。与此同时,我注意到以下警告:
警告4警告LNK4248:未解析的typeref标记(01000028) ' sqlite3_stmt&#39 ;;图像可能无法运行。
我正在使用MS visual studio 2010 Windows窗体应用程序。
有人可以帮忙吗?
答案 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);