C/C++中的SQLite。sqlite3_exec:回调函数中设置的参数指向空字符串
我尝试做一些非常基本的事情——使用返回SELECT语句的结果。我的数据表只有两个字段-key varchar和value text 给定键,我的目标是通过查询SQLite数据库返回值。我传递给*sqlite3\u exec*-*选择回调*函数以及param char*。参数已成功设置为*select_callback*中的正确值。但是,在调用*sqlite3_exec*后,param指向一个空字符串,尽管它指向相同的内存 知道哪里出了问题,怎么解决吗?*sqlite3\u exec*是否在幕后为param释放内存 提前谢谢你C/C++中的SQLite。sqlite3_exec:回调函数中设置的参数指向空字符串,c,sqlite,pointers,void-pointers,C,Sqlite,Pointers,Void Pointers,我尝试做一些非常基本的事情——使用返回SELECT语句的结果。我的数据表只有两个字段-key varchar和value text 给定键,我的目标是通过查询SQLite数据库返回值。我传递给*sqlite3\u exec*-*选择回调*函数以及param char*。参数已成功设置为*select_callback*中的正确值。但是,在调用*sqlite3_exec*后,param指向一个空字符串,尽管它指向相同的内存 知道哪里出了问题,怎么解决吗?*sqlite3\u 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);
参数应为{名称:Instagram照片,url:http://instagram.com},但由于某种原因,它是空字符串
您正在将指向新分配内存的指针写入res,但该变量是select\u回调中的一个局部变量,因此sql\u exec不会知道它。 这同样适用于param参数:它只是sqlite3_exec的第四个参数的副本 <> P>为了确保对字符串的更改,必须传递指向C的指针本身的指针,或者可以是C++中的字符串对象,类似于错误消息。 对于C: 注意:当tid字符串包含引号或其他控制字符时,或者当您尝试搜索时,您将遇到问题。
用于格式化和分配SQL字符串,或者更好地使用。我尝试了最后一个答案,它对我有效: 我已经创建了一个指向指针的指针作为char值,并从void变量中插入了指针的指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
int callback(void *data,int argc,char *argv[],char **azcolname) {
int i=0;
char **result_str = (char **)data;
*result_str = (char *)calloc(strlen(argv[0]),sizeof(char));
strcpy(*result_str,argv[0]);
return 0;
}
int main(int argc,char *argv[]) {
sqlite3 *conn;
int c=0;
char *ofile=NULL;
char *tsql_stmt=NULL;
int res=0;
char *zErrMsg = 0;
char *data=NULL;
while((c = getopt(argc , argv ,"f:")) != -1)
{
switch (c) {
case 'f':
ofile = optarg;
break;
default:
fprintf(stderr,"worng argument provided\n");
break;
}
}
if (!ofile) {
fprintf(stderr,"no output file (-f) given\n");
exit(1);
}
sqlite3_open(ofile,&conn);
tsql_stmt = calloc(80,sizeof(char));
strcpy(tsql_stmt,"SELECT count(*) FROM sqlite_master WHERE type='table' AND name='");
strcat(tsql_stmt,"mytest");
strcat(tsql_stmt,"\'");
//running the query
//printf("%s\n",tsql_stmt);
res = sqlite3_exec(conn,tsql_stmt,callback,&data, &zErrMsg);
if ( res != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else{
if ( atoi(data) != 1)
fprintf(stderr, "unable to find the requested table\n");
else
printf("the Operation found the requested table in the database\n");
}
free(data);
sqlite3_close(conn);
return 0;
}
你说的大小是什么意思?!这是一个编译时的表达式,等于1。我假设你使用C。因此,我删除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, ...);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
int callback(void *data,int argc,char *argv[],char **azcolname) {
int i=0;
char **result_str = (char **)data;
*result_str = (char *)calloc(strlen(argv[0]),sizeof(char));
strcpy(*result_str,argv[0]);
return 0;
}
int main(int argc,char *argv[]) {
sqlite3 *conn;
int c=0;
char *ofile=NULL;
char *tsql_stmt=NULL;
int res=0;
char *zErrMsg = 0;
char *data=NULL;
while((c = getopt(argc , argv ,"f:")) != -1)
{
switch (c) {
case 'f':
ofile = optarg;
break;
default:
fprintf(stderr,"worng argument provided\n");
break;
}
}
if (!ofile) {
fprintf(stderr,"no output file (-f) given\n");
exit(1);
}
sqlite3_open(ofile,&conn);
tsql_stmt = calloc(80,sizeof(char));
strcpy(tsql_stmt,"SELECT count(*) FROM sqlite_master WHERE type='table' AND name='");
strcat(tsql_stmt,"mytest");
strcat(tsql_stmt,"\'");
//running the query
//printf("%s\n",tsql_stmt);
res = sqlite3_exec(conn,tsql_stmt,callback,&data, &zErrMsg);
if ( res != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else{
if ( atoi(data) != 1)
fprintf(stderr, "unable to find the requested table\n");
else
printf("the Operation found the requested table in the database\n");
}
free(data);
sqlite3_close(conn);
return 0;
}