簡體   English   中英

如何使用sqlite3_exec從sqlite3數據庫中選擇數據到變量中?

[英]How do I select data from an sqlite3 database into variables using sqlite3_exec?

在interweb上有一百萬個例子,詳細說明了使用sqlite3_exec從表中選擇行並使用這個回調函數打印它們:

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

這是實現callback的代碼:

[...]
rc = sqlite3_exec(db, sql, callback, &nrecs, &zErrMsg);
[...]

現在,我認為將獲取的數據用於除打印之外的其他內容將是一個相當標准的場景,但對於我的生活,我無法找到應該如何實現。

我想要做的是獲取包含兩列的一行( argc將為1)並且可以從執行sqlite3_exec訪問這兩個值( argv[0]argv[1] )。

我想這與void *NotUsed (世界上這是一個指針,為什么所有的例子都堅持不使用它?)

如果有人可以幫助我,我會非常感激。 如果你還能向我解釋為什么這個看似微不足道的任務變得如此復雜,你將擁有我永恆的愛。 (獲取的數據在從另一個函數調用的靜態函數中處理。這有效地殺死了使用面向對象語言的目的,對吧?)

'key'是sqlite3_exec的第四個參數。

通常情況是這樣的:你有這個結構,你不能用sqlite查詢填寫:

struct xyz_t
{
   int a ;
   int b ;
} ;

然后你像這樣調用sqlite3_exec:

//fill in query text
xyz_t xyz; // struct you want to fill
sqlite3_exec(db, sql, callback, &xyz, &zErrMsg);

回調就是這樣做的:

static int callback(void *veryUsed, int argc, char **argv, char **azColName){
  int i;
  xyz_t *xyz = (xyz_t *)veryUsed ;
  for(i=0; i<argc; i++){
    if (strcmp(azColName[i], "a") == 0)
       xyz->a = atoi(argv[1]) ;
    else if ...
  }
  return 0;
}

你甚至可以在每次調用時傳遞std :: vector和push_back一個新的xyz_t。 不適合C ++程序員,但這是一個混合的C / C ++世界......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM