我遇到了一个问题,即预准备语句和绑定值适用于Insert语句,但不适用于Select语句......下面是一段代码
int main(int argc, CHAR* argv[])
{
sqlite3 *db; // sqlite3 db struct
char *zErrMsg = 0;
char *szSQL;
int rc;
// Open the test.db file
rc = sqlite3_open("test32.db", &db);
if( rc )
{
// failed
fprintf(stderr, "Can't open database: %s\n",
sqlite3_errmsg(db));
}
else
{
// success
fprintf(stderr, "Open database successfully\n");
}
// create myTable
//szSQL = "create table myTable1011 (FirstName varchar(30), LastName varchar(30), Age smallint not null);";
// rc = sqlite3_exec(db, szSQL, callback, 0, &zErrMsg);
// if( rc == SQLITE_OK )
// {
//insert 1 record into myTable
// RunInsertParamSQL(db, "asyb", "com", 42);
// fetch records
sqlite3_stmt *stmt;
const char *pzTest;
//Doesnt WORK
szSQL = "select * from myTable1011 where age = ?";
rc = sqlite3_prepare_v2(db, szSQL, strlen(szSQL), &stmt, &pzTest);
if( rc == SQLITE_OK )
// bind the value
int test = 42;
sqlite3_bind_int(stmt, 1, test);//Doesnt work if i give 42 directly instead if test in bind statement
// commit
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
// rc = sqlite3_exec(db, szSQL, callback, 0, &zErrMsg);
// Close test.db file
sqlite3_close(db);
getchar();
return 0;
}
// Insert rec
//WORKS WELL
void RunInsertParamSQL(sqlite3 *db, char *fn, char *ln, int age)
{
if (!db)
return;
char *zErrMsg = 0;
sqlite3_stmt *stmt;
const char *pzTest;
char *szSQL;
// Insert data item into myTable
szSQL = "insert into myTable1011 (FirstName, LastName, Age) values (?,?,?);";
int rc = sqlite3_prepare(db, szSQL, strlen(szSQL), &stmt, &pzTest);
if( rc == SQLITE_OK ) {
// bind the value
sqlite3_bind_text(stmt, 1, fn, strlen(fn), 0);
sqlite3_bind_text(stmt, 2, ln, strlen(ln), 0);
sqlite3_bind_int(stmt, 3, age);
// commit
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
}
除了成功打开数据库外,没有其他输出
但是如果我给予szSQL =“从我的表1011中选择 *”;rc = sqlite3_exec(数据库,szSQL,回调,0,和zErrMsg);//我得到了整个表....
如何选择性打印??为什么Where条件失败?????
3条答案
按热度按时间pwuypxnk1#
没有输出,因为代码甚至不尝试输出任何内容。
您必须使用sqlite3_column_* functions:
cyej8jka2#
我终于明白了...
如果你使用Sprintf而不是Prepare/Bind语句,我可以得到一个输出...
这会有用的...
4szc88ey3#
我也遇到过类似的情况,但不完全一样。我将描述我看到的和我修复的,以防其他人也有同样的问题:
我想查询一个现有的SQLite3数据库文件,所以我没有尝试任何INSERT语句,而只是基本的
select * from sqlite_master where type='table'
-但我没有得到任何输出(我想类似于OP)。在我的例子中,这是我的一个非常简单的错误-当打开数据库文件时,我从配置文件中读取了位置,在那里我忘记提到子目录,所以文件不存在于该位置。关键是,我用于打开数据库文件的
sqlite3_open()
语句返回了成功,所以我认为它已经正确地打开了文件。但它实际上做的是非常愉快地创建一个新的空数据库文件。这没有表要显示,所以它正确地显示了什么。现在我发现在the documentation for sqlite3_open中可以使用
sqlite3_open_v2()
,它允许我指定以下内容之一:SQLITE_OPEN_READONLY
、SQLITE_OPEN_READWRITE
或SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
。如果数据库文件尚不存在,则前两个标志返回错误,如果文件尚不存在,则第三个标志组合创建该文件,并且是“始终用于sqlite3_open()
的行为..."。使用此标志可以帮助我更快地识别问题:-)