我正在尝试一些非常基本的东西 -使用SQLite 的 C/C++ 接口SELECT
返回语句的结果。我的数据表只有两个字段 - 键(varchar)和值(文本)。
给定密钥,我的目标是通过查询 SQLite 数据库返回值。我传递给 *sqlite3_exec* - *select_callback* 函数以及参数(char *)。参数已成功设置为 *select_callback* 中的正确值。但是,在调用 *sqlite3_exec* 之后,参数指向一个空字符串(尽管指向相同的内存)。
知道出了什么问题以及如何解决这个问题吗?*sqlite3_exec* 是否在幕后为参数释放内存?
先感谢您!
// given the key tid returns the value
void getTypeByID(sqlite3 * db, string tid)
{
string sql_exp_base = "select value from Data where key=''";
int len = (int)sql_exp_base.size() + (int)tid.size() + 10;
char * sql_exp = new char[len];
sprintf(sql_exp, "select value from Data where key='%s'", tid.data());
sql_exec(db, sql_exp);
}
// This is the callback function to set the param to the value
static int select_callback(void * param, int argc, char **argv, char **azColName)
{
if(argc == 0) return 0;
char * res = (char *)param;
res = (char *) realloc(res, sizeof(*res));
res = (char *) malloc(strlen(argv[0]) + 1);
strcpy(res, argv[0]);
printf("%s\n", res); // {"name": "Instagram Photo", url: "http://instagram.com"}
return 0;
}
// execute the SQL statement specified by sql_statement
void sql_exec(sqlite3 * db, const char * sql_statement)
{
char * zErrMsg = 0;
char * param = (char *)calloc(1, sizeof(*param));
int rc = sqlite3_exec(db, sql_statement, select_callback, param, &zErrMsg);
printf("%s\n", param);
参数应该是 {"name": "Instagram Photo", url: "http://instagram.com"},但由于某种原因它是空字符串!
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
}