无回调的sqlite3_exec
是否有任何方法可以不通过回调获得sqlite3_exec()结果? 当我进行搜索时,我希望直接得到结果,最像是函数的返回或作为OUT参数无回调的sqlite3_exec,sqlite,callback,Sqlite,Callback,是否有任何方法可以不通过回调获得sqlite3_exec()结果? 当我进行搜索时,我希望直接得到结果,最像是函数的返回或作为OUT参数 谢谢。调用回调是sqlite3\u exec的设计工作方式 如果您想要一个为结果分配所有内存并返回该结果的函数,则需要一个不同的函数,如。回调是sqlite3_exec()用于返回一个或多个结果的机制。它看起来主要用于select SQL语句。如果select SQL语句返回多行结果,则sqlite功能将为每行调用指定的回调函数 我不确定你是用C还是C++或者
谢谢。调用回调是
sqlite3\u exec
的设计工作方式
如果您想要一个为结果分配所有内存并返回该结果的函数,则需要一个不同的函数,如。回调是
sqlite3_exec()
用于返回一个或多个结果的机制。它看起来主要用于select SQL语句。如果select SQL语句返回多行结果,则sqlite功能将为每行调用指定的回调函数
我不确定你是用C还是C++或者其他语言,但是我有可能用C语言和SQLite。< /P>
回调函数的第一个参数是一个void指针,它可以指向几乎任何东西。例如,它可以指向一个结构,该结构包含一个指向为结果分配的内存区域的指针以及指示内存区域大小的参数
我给出了这个stackoverflow问题的答案,并给出了一个使用select SQL语句的结果填充C结构的回调示例。在本例中,我有一个回调,它从select中获取一个或多个行结果,并将结果转换为数据值以放入C结构中。当sqlite3\u exec()
函数返回时,我使用C结构处理select的结果
这可能就是您要寻找的,因为您可以创建select SQL语句,设置结果结构,调用
sqlite3\u exec()
指定结果结构以及指向回调的函数指针,以使用结果结构处理结果,并且在sqlite3\u exec()时
return您有选择的结果。选择的结果将出现在您调用的sqlite3\u exec()
sqlite3\u exec
是一个方便的包装器的位置
如果不需要回调,则应直接使用底层函数:sqlite3\u prepare\u v2()
、sqlite3\u step()
、和sqlite3\u finalize()
sqlite3\u prepare\u v2()编译sql查询
sqlite3\u step()
执行查询所需的次数,使用
sqlite3\u column\u bytes()
etc检索数据sqlite3\u finalize()销毁准备好的查询
但它需要更多的编码和仔细的错误处理。我已经编写了一些代码,允许我们根据sql查询(zSql)从开放数据库(db)读取数据,而无需回调。 请注意,此代码可以工作,但可能仍需要一些工作(例如,我不确定是否需要释放文本数据…)
int RunSqlNoCallback(sqlite3*db,const char*zSql)
{
sqlite3_stmt*stmt=NULL;
int rc=sqlite3\u prepare\u v2(db,zSql,-1,&stmt,NULL);
如果(rc!=SQLITE_OK)
返回rc;
int rowCount=0;
rc=sqlite3_步(stmt);
而(rc!=SQLITE\u完成&&rc!=SQLITE\u确定)
{
行计数++;
int colCount=sqlite3\u column\u count(stmt);
对于(int colIndex=0;colIndex
看来不推荐使用sqlite3_get_table(),它是为兼容而保留的一个遗留版本,非常感谢!这个代码对我来说很有效。尽管如此,我认为我们不应该释放瓦尔查尔。首先,它在一次迭代后崩溃,我认为它是指向数据库中静态内容的指针,而不是它的副本。它在这里说:内存是自动释放的:“用于保存字符串和blob的内存空间是自动释放的。不要传递从sqlite3_column_blob(),sqlite3_column_text()返回的指针这里的某些答案很麻烦。你告诉最初的提问者如何做某事,很明显他已经知道如何做了,这是他试图避免的方法。
int RunSqlNoCallback(sqlite3 * db, const char * zSql)
{
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, NULL);
if (rc != SQLITE_OK)
return rc;
int rowCount = 0;
rc = sqlite3_step(stmt);
while (rc != SQLITE_DONE && rc != SQLITE_OK)
{
rowCount++;
int colCount = sqlite3_column_count(stmt);
for (int colIndex = 0; colIndex < colCount; colIndex++)
{
int type = sqlite3_column_type(stmt, colIndex);
const char * columnName = sqlite3_column_name(stmt, colIndex);
if (type == SQLITE_INTEGER)
{
int valInt = sqlite3_column_int(stmt, colIndex);
printf("columnName = %s, Integer val = %d", columnName, valInt);
}
else if (type == SQLITE_FLOAT)
{
double valDouble = sqlite3_column_double(stmt, colIndex);
printf("columnName = %s,Double val = %f", columnName, valDouble);
}
else if (type == SQLITE_TEXT)
{
const unsigned char * valChar = sqlite3_column_text(stmt, colIndex);
printf("columnName = %s,Text val = %s", columnName, valChar);
free(valChar);
}
else if (type == SQLITE_BLOB)
{
printf("columnName = %s,BLOB", columnName);
}
else if (type == SQLITE_NULL)
{
printf("columnName = %s,NULL", columnName);
}
}
printf("Line %d, rowCount = %d", rowCount, colCount);
rc = sqlite3_step(stmt);
}
rc = sqlite3_finalize(stmt);
return rc;
}