sqlite3 程序接收信号 SIGSEGV,分段错误在 sqlite3_get_table ()
sqlite3 Program received signal SIGSEGV, Segmentation fault in sqlite3_get_table ()
我在下面粘贴了我的代码。它在 sqlite3_get_table (( 处给出 seg 错误。我想获取表中的行数并返回它。如果行数大于 0,则程序需要读取所有行。
int countRowsInTable(( {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char const *sql;
char ***pazResult;
int *pnRow; /* Number of result rows written here */
int *pnColumn; /* Number of result columns written here */
rc = sqlite3_open("DeviceDetails.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
return(0);
}
else
{
fprintf(stderr, "Opened database successfullyn");
}
/* Create SQL statement */
sql = "select * from Device_Details";
/* Execute SQL statement */
// rc = sqlite3_exec(db, sql, 0/*callback*/, 0/*(void*)data*/, &zErrMsg);
rc = sqlite3_get_table(db, sql, pazResult, pnRow, pnColumn, &zErrMsg);
void sqlite3_free_table(char **result);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %sn", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
fprintf(stdout, "Operation done successfullyn");
cout<<"rows="<<pnRow<<endl;
sleep(10);
}
sqlite3_close(db);
cout<<"num rows =" << *pnRow <<endl;
}
阅读您的建议后,我更改了我的代码。现在我使用选择计数 (*(,但其中 (哪个( 变量将保存行数。做,我需要在sqlite3_exec中实现回调函数。如果行计数大于零,我还需要获取数据。如果我在回调函数中获取数据,如何将其传递给调用 countRows in table 的函数?可能是我可以保留一个全局变量。一旦回调被执行,它将通过条件变量向调用函数发出信号。所以我必须在新线程中维护 countRowsInTable 函数。我有更简单的方法吗?
int countRowsInTable()
{
sqlite3 *db;
char *zErrMsg = new char[64];
int rc;
char const *sql;
char ***pazResult;
int *pnRow = new int; /* Number of result rows written here */
int *pnColumn = new int; /* Number of result columns written here */
//*pnRow = 0;
**pazResult = new char[20480];
rc = sqlite3_open("DeviceDetails.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
return(0);
}
else
{
fprintf(stderr, "Opened database successfullyn");
}
/* Create SQL statement */
sql = "select count(*) from Device_Details";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, 0/*callback*/, 0/*(void*)data*/, &zErrMsg);
//rc = sqlite3_get_table(db, sql, pazResult, pnRow, pnColumn, &zErrMsg);
//void sqlite3_free_table(char **result);
if( rc != SQLITE_OK )
{
fprintf(stderr, "SQL error: %sn", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
fprintf(stdout, "Operation done successfullyn");
}
}
您没有使用正确的参数调用函数。您正在传递未初始化的指针,而您必须创建变量并在其上传递指针,以便 SQLite 可以写入值。
const char *sql = "select * from Device_Details";
char **result;
int nrow;
int ncolumn;
char *errmsg;
int rc;
rc = sqlite3_get_table(db, sql, &result, &nrow, &ncolumn, &errmsg);
但是,您应该知道SQLite手册不鼓励使用该函数:"这是一个保留的遗留接口,以便向后兼容。不建议使用此接口。
此外,您应该删除可能错误粘贴的void sqlite3_free_table(char **result)
。
相关文章:
- Cpp-Tuple使用带有变量的get
- 无法在windows上使用mingw将sqlite3与c连接
- 通过 get-Method 访问变量在类外不起作用
- sqlite3 和生成文件中的链接出现问题
- 如何在 sqlite3 中的表中添加整数列表
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++中是否有任何函数等同于python中字典的get函数?
- SQLite3 在 c++ 中输出 SELECT 上的空列表
- 使用istringstearm和get行缓慢读取文件
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 使用 cin.get() 初始化字符数组
- 打印从SQLite3数据库检索的数据C++与命令行中相同的方式
- Sqlite3:将数据库表名存储在向量中
- std::variant<>::get() 不能使用 Apple LLVM 10.0 编译
- 编写 cin.get() 以接收字符数组时出现问题
- 如何使用 c++ 在 sqlite3 中打开受密码保护的数据库?
- 作用域枚举和标准::get
- Visual Studio 2017 中的 cpprestapi 问题找不到 POST/GET 常量
- 在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求