带有?的SQLITE Select查询无法打印

62o28rlo  于 2023-01-13  发布在  SQLite
关注(0)|答案(3)|浏览(171)

我遇到了一个问题,即预准备语句和绑定值适用于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条件失败?????

pwuypxnk

pwuypxnk1#

没有输出,因为代码甚至不尝试输出任何内容。
您必须使用sqlite3_column_* functions

...
for (;;) {
    rc = sqlite3_step(stmt);
    if (rc != SQLITE_ROW)
        break;
    // this depends on what columns you actually have:
    int         first_column  = sqlite3_column_int (stmt, 0);
    const char *second_column = sqlite3_column_text(stmt, 1);
    ...
    printf("ID: %d, name: %s\n", first_column, second_column);
}
if (rc != SQLITE_DONE)
    printf("error: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
...
cyej8jka

cyej8jka2#

我终于明白了...
如果你使用Sprintf而不是Prepare/Bind语句,我可以得到一个输出...

sprintf(szSQL,"select * from Foldersonly WHERE Foldersonly.FolderName = \"%s\" ",Root_Path);
sqlite3_exec(db, szSQL, callback, 0, &zErrMsg);

这会有用的...

4szc88ey

4szc88ey3#

我也遇到过类似的情况,但不完全一样。我将描述我看到的和我修复的,以防其他人也有同样的问题:
我想查询一个现有的SQLite3数据库文件,所以我没有尝试任何INSERT语句,而只是基本的select * from sqlite_master where type='table'-但我没有得到任何输出(我想类似于OP)。
在我的例子中,这是我的一个非常简单的错误-当打开数据库文件时,我从配置文件中读取了位置,在那里我忘记提到子目录,所以文件不存在于该位置。关键是,我用于打开数据库文件的sqlite3_open()语句返回了成功,所以我认为它已经正确地打开了文件。但它实际上做的是非常愉快地创建一个新的空数据库文件。这没有表要显示,所以它正确地显示了什么。
现在我发现在the documentation for sqlite3_open中可以使用sqlite3_open_v2(),它允许我指定以下内容之一:SQLITE_OPEN_READONLYSQLITE_OPEN_READWRITESQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE。如果数据库文件尚不存在,则前两个标志返回错误,如果文件尚不存在,则第三个标志组合创建该文件,并且是“始终用于sqlite3_open()的行为..."。使用此标志可以帮助我更快地识别问题:-)

相关问题