c++ - sqlite3程序收到信号SIGSEGV,sqlite3_get_table()中出现段错误

标签 c++ c linux sqlite

我已将我的代码粘贴在下面。它在 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: %s\n", sqlite3_errmsg(db));
                  return(0);
              }
              else
              {
                  fprintf(stderr, "Opened database successfully\n");
              }

              /* 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: %s\n", zErrMsg);
                  sqlite3_free(zErrMsg);
              }
              else
              {
                  fprintf(stdout, "Operation done successfully\n");
                  cout<<"rows="<<pnRow<<endl;
                  sleep(10);
              }
              sqlite3_close(db);
              cout<<"num rows =" << *pnRow <<endl;

      }

阅读您的建议后,我更改了我的代码。现在我使用 select count (*),但是 where (which) 变量将保存行数。是吗,我需要在sqlite3_exec中实现回调函数。如果行数大于零,我还需要获取数据。如果我在回调函数中获取数据,如何将其传递给调用表中 countRows 的函数?也许我可以保留一个全局变量。一旦执行回调,它就会通过条件变量向调用函数发出信号。所以我必须在新线程中维护 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: %s\n", sqlite3_errmsg(db));
                  return(0);
              }
              else
              {
                  fprintf(stderr, "Opened database successfully\n");
              }

              /* 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: %s\n", zErrMsg);
                  sqlite3_free(zErrMsg);
              }   
              else
              {
                  fprintf(stdout, "Operation done successfully\n");


              }


      }

最佳答案

您没有使用正确的参数调用该函数。您正在传递未初始化的指针,而您必须创建变量并在它们上传递指针,以便 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 手册不鼓励使用该函数:“这是为向后兼容而保留的遗留接口(interface)。不建议使用此接口(interface)。”

此外,您应该删除您可能错误粘贴的void sqlite3_free_table(char **result)

关于c++ - sqlite3程序收到信号SIGSEGV,sqlite3_get_table()中出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45389960/

相关文章:

c++ - 树遍历不打印正确的顺序

c++ - <file> 所需的名称无效 - visual studio 2015

c - 从内核空间的 inode 读取原始字节

linux - 如何从 bash shell 通过 SSH 连接到多个服务器并提供完整登录?

python - 无法在端口 80 上运行 Ec2-server

c++ - 什么类型的数据结构对于搜索进程表是有效的

c - 为什么在我使用归并排序时,一个额外的元素被添加到我的 void** 数组中?

c - 如何将数据从数组发送到指针变量并从指针变量返回到数组?

linux - 将特定传出 url 重新路由到另一个 url - linux ubuntu 16.04

c++ - 在 C++ 中,访问未初始化的数组是未指定行为还是未定义行为?