2011-04-28 191 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