2011-04-28 196 views
1

我使用C++和SQLite3(使用Microsoft Visual C++ 2008)並希望從我的數據庫中讀取值並將其存儲在變量中以使用它。 select語句可以正常工作,但每次查看回調函數並嘗試從char ** argv讀取值時,我都會得到「僅」內存地址或數據庫中值的第一個ASCII字符。我究竟做錯了什麼? 這裏是回調函數:C++,SQLite - 指向字符串的指針的指針

static int callback(void *pArg, int argc, char **argv, char **azColName) 
{ 
fprintf(f, "Callback aufgerufen!\n"); 
int i; 

for(i=0; i<argc; i++) 
{ 
    fprintf(f, azColName[i]); 
    fprintf(f, " = "); 
    if(argv[i]){ 
     fprintf(f, argv[i]); 
     //unsigned int x = argv[i]; 
    } 

    else 
     fprintf(f, "NULL"); 
     fprintf(f, "\n"); 
} 
fprintf(f, "\n"); 
return 0; 
} 

我試了一下沒有回調函數,但我再次得到相同的結果,我已經嘗試了不同的方式存儲在一個變量的值。

while (sqlite3_step(stmt) == SQLITE_ROW) 
{ 
    fprintf(f, "%s\n", sqlite3_column_text(stmt, 0)); 
//const unsigned char *c = sqlite3_column_text(stmt, 0); 
fprintf(f, "%u\n", sqlite3_column_int(stmt, 0)); 
//unsigned int z = *sqlite3_column_int(stmt, 0); 

stmt_count++; 
} 

可能無法訪問該值或將其存儲在變量中嗎?

+1

注意,通過任意的字符串作爲fprintf'的'第二個參數(或'printf'的第一個參數)是一個非常糟糕的主意,可能導致各種可怕的腐敗或漏洞。 – 2011-04-28 07:21:11

回答

0

我不明白爲什麼你需要一個回調 - 這應該工作(具體取決於數據的大小):

char myvalue[100]; 
while (sqlite3_step(stmt) == SQLITE_ROW) 
{ 
    strcpy(myvalue, (const char *) sqlite3_column_text(stmt, 0)); 
    // do something with myvalue 
    stmt_count++; 
} 
+0

(我不需要回調,這就是爲什麼我添加了我的第二個「解決方案」的原因。)不,這不起作用。我收到一個轉換錯誤:'const unsigned char *'到'const char *'不可能,當我嘗試解決這個問題時,我得到新的錯誤。 -.- – Baileys 2011-04-28 08:27:12

+0

@Baileys啊,我現在記得 - 你需要演員陣容 - 從使用SQLite開始已經很長時間了!見編輯的答案。 – 2011-04-28 08:33:24

+0

哇!謝謝!你已經在幾分鐘內解決了我的問題!謝謝! (我在這個問題上坐了很久......) – Baileys 2011-04-28 09:26:36