2017-07-29 40 views
-2

我粘貼了下面的代碼。它在sqlite3_get_table()中給出seg錯誤。我想獲取表中的行數並返回。如果行數大於0,程序需要讀取所有行。sqlite3程序接收到的信號SIGSEGV,sqlite3_get_table()中的分段錯誤

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(*),但哪裏(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"); 


       } 


     } 
+0

嘗試更改char * zErrMsg = 0; char ** zErrmsg; – Ihdina

+0

始終在啓用警告的情況下編譯代碼。 –

+0

不,這沒有幫助 –

回答

1

您沒有使用正確的參數調用該函數。您傳遞的是未初始化的指針,而您必須創建變量並在其上傳遞指針,以便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)

+0

如果它被棄用,那麼我還應該使用什麼?我需要獲取行數,如果大於零,那麼讀取所有數據 –

+0

您可以使用'sqlite3_prepare'編譯您的sql語句,然後'sqlite3_step'來檢索行並'sqlite3_finalize'完成。這裏記錄API:https://www.sqlite.org/cintro.html –

相關問題