2017-04-08 78 views
2

我一直在使用SQLite + C++進行一段時間的項目工作,似乎無法使其工作。現在,我的代碼並沒有像控制檯那樣在控制檯中顯示任何內容。我得到的錯誤是syntax incorrect near "S"。我的代碼是:「S」附近的SQLite語法不正確

/*Definitions*/ 
sqlite3 *db; 
sqlite3_stmt *statement; 
void *arg; 
char *err; 
const char stmt = *"SELECT * from table"; 
/*End of Definitions*/ 

int exec(void *arg, int argc, char **argv, char **column) { 
    while(true) { 
     int i = 0; 
     for(i < argc;) { 
      cout << column[i] << ": " << argv[i] << endl; 
      i++; 
     } 
     cout << "------" << endl; 
    } 
} 

int main() { 
    int rc = sqlite3_open("test.sqlite", &db); /*Open db "test.sqlite"*/ 
    if(!rc) { 
     sqlite3_exec(db, &stmt, exec, arg, &err); 
    } 
    /*Ending Stuffz (NOTHING BEYOND THIS POINT)*/ 
    cin.get(); 
    return 0; 
} 

數據庫包含此表中的數據,但不會顯示。我曾在一點工作,但只有一行工作,然後停下來。我是愚蠢的和被忽視的備份,現在我在這個混亂中,因爲我試圖修復它。任何幫助表示讚賞。

回答

2

的問題在這條線開始:

const char stmt = *"SELECT * from table"; 

這產生了單個char從字符串文字複製的值'S',因爲施加到串中的星號字面這樣簡單地會得到char const[]的第一個字符,並忽略其餘字符。

然後您提供char對象的地址SQLite的位置:

sqlite3_exec(db, &stmt, exec, arg, &err); 

函數需要char const*作爲第二個參數。儘管its documentation沒有明確地這樣說,但它自然期待指向以空終止的char陣列的指針,而不是指向單個的char

因此,您正在運行到未定義的行爲在這裏,因爲功能不斷尋找終止,進入內存不允許訪問。

你也是不幸的,因爲,而不是崩潰,從而顯示你錯誤所在,什麼明顯的情況是,一個可訪問'\0'恰好在那裏在內存中'S'之後。

所以你實際上是傳遞單個字母「S」作爲SQL字符串,並且該函數正確地抱怨。

的治療很簡單:

const char* stmt = "SELECT * from table"; 

[...]

sqlite3_exec(db, stmt, exec, arg, &err); 
+0

三江源!但是,這樣可以修復我列出的第一個問題,但輸出第一行的問題仍然存在。有什麼方法可以讓你知道我該如何解決這個問題? –

+0

@rEbOot:每個問題請注意一個問題/問題/錯誤! :) Stack Overflow鼓勵你爲單獨的問題提出單獨的問題。 –

+0

我必須等待,才能再次發帖。 –