gpt4 book ai didi

c - C/C++ 中的 SQLite。 sqlite3_exec : parameter set in callback function is pointing to an empty string

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:56 28 4
gpt4 key购买 nike

我正在尝试做一些非常基本的事情 - 使用 C/C++ interface for SQLite 返回 SELECT 语句的结果| .我的数据表只有两个字段 - 键(varchar)和值(文本)。

给定键,我的目标是通过查询 SQLite 数据库返回值。我传递给 *sqlite3_exec* - *select_callback* 函数以及 param (char *)。 param 在 *select_callback* 中成功设置为正确的值。但是,在调用 *sqlite3_exec* 之后,param 指向一个空字符串(尽管指向相同的内存)。

知道出了什么问题以及如何解决这个问题吗? *sqlite3_exec* 是​​否在幕后为 param 释放内存?

提前致谢!

// 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);

param 应该是 {"name": "Instagram Photo", url: "http://instagram.com"},但由于某些原因它是空字符串!

    if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
}

最佳答案

您正在将指向新分配内存的指针写入 res,但该变量是 select_callback 中的局部变量,因此 sql_exec 将不知道。这同样适用于 param 参数:它只是 sqlite3_exec 的第四个参数的副本。

为了确保看到你对字符串的更改,你必须传递一个指向字符串本身的指针(在 C 中是一个指针,或者在 C++ 中可以是一个 string 对象),类似到错误消息。对于 C:

char *result_str = ...;
rc = sqlite3_exec(..., &result_str, ...);
...
int callback(void *param, ...)
{
char **result_str = (char **)param;
*result_str = (char *)realloc(*result_str, ...);
strcpy(*result_str, ...);
}

注意:当 tid 字符串包含引号或其他控制字符时,或者当您尝试搜索 Bobby Tables 时,您会遇到问题。 .使用 sqlite3_mprintf格式化和分配 SQL 字符串,或者更好地使用 parameters .

关于c - C/C++ 中的 SQLite。 sqlite3_exec : parameter set in callback function is pointing to an empty string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com