2010-10-21 124 views
2

我有三個查詢,我通過SQLite運行。這些就是我正在運行的;第一個是表格聲明,接下來的3個是實際的查詢。SQLite崩潰插入項目

聲明:

「CREATE TABLE IF NOT EXISTS項目(busid INTEGER PRIMARY KEY,IP地址文本,時間TEXT DEFAULT(NOW()));」

查詢:

  1. (工程) 「INSERT INTO項目(時間,IPADDR)VALUES( '試驗', '192.168.1.1');」 (崩潰)「INSERT INTO items(busid,ipaddr)VALUES(10,'192.168.1.1');」 (崩潰)「INSERT INTO items(ipaddr)VALUES('192.168.1.1');」

查詢1工作正常,而查詢2和3導致崩潰通過內sqlite3ExprCodeTarget一個EXC_BAD_ACCESS的手段。追溯,我發現我的代碼觸及的最後一點是sqlite3_prepare_v2()語句,它傳遞有效的數據庫/字符串/ etc。正如我所說的,在上面的聲明1中工作正常,但不是2或3.這有什麼問題,我該如何解決?謝謝。

編輯1:澄清,查詢1,2和3在程序的不同運行中分別運行,而不是按順序運行,並且數據庫在運行之間被銷燬,因此運行查詢1對運行查詢沒有影響2重置後。

編輯2:實例C++源文件顯示問題:

#include <iostream> 
using namespace std; 
#include <sqlite3.h> 

int main (int argc, const char * argv[]) { 

    sqlite3 *db; 
    sqlite3_open("/Users/Justin/Desktop/test.db", &db); 

    string createQuery = "CREATE TABLE IF NOT EXISTS items (busid INTEGER PRIMARY KEY, ipaddr TEXT, time TEXT NOT NULL DEFAULT (NOW()));"; 
    sqlite3_stmt *createStmt; 
    cout << "Creating Table Statement" << endl; 
    sqlite3_prepare_v2(db, createQuery.c_str(), createQuery.size(), &createStmt, NULL); 
    cout << "Stepping Table Statement" << endl; 
    if (sqlite3_step(createStmt) != SQLITE_DONE) cout << "Didn't Create Table!" << endl; 

    // COMMENT OUT UNUSED ONES 
    // First one works, second and third ones fail. 

    string insertQuery = "INSERT INTO items (time, ipaddr) VALUES ('test', '192.168.1.1');"; // WORKS! 
    //string insertQuery = "INSERT INTO items (busid, ipaddr) VALUES (10, '192.168.1.1');"; // FAILS! 
    //string insertQuery = "INSERT INTO items (ipaddr) VALUES ('192.168.1.1');"; // FAILS! 

    sqlite3_stmt *insertStmt; 
    cout << "Creating Insert Statement" << endl; 
    sqlite3_prepare_v2(db, insertQuery.c_str(), insertQuery.size(), &insertStmt, NULL); 
    cout << "Stepping Insert Statement" << endl; 
    if (sqlite3_step(insertStmt) != SQLITE_DONE) cout << "Didn't Insert Item!" << endl; 

    cout << "Success!" << endl; 
} 

剛剛成立的源代碼,無論你想它來創建測試數據庫的數據庫路徑。

回答

2

我下載源,編譯和依次註釋掉每行跑,所有工程確定

源碼版本3.6.23.1

紅帽5 32位

所以我想答案是 - 升級到最新版本的sqlite

+0

我有AV長使&&sudo make install運行,所以我想要的東西來打發時間:-) – pm100 2010-10-21 20:33:07

+0

好吧,我試過最新版本的sqlite(我在Mac OS 10.6.4它與3.6.12捆綁在一起)而後兩個不會崩潰,但也不要添加該項目;它似乎錯誤是「未知函數:NOW()」。所以看起來錯誤是在CREATE TABLE語句中,我試圖設置NOW()的默認值。事實證明,不是'NOW()'我必須在SQLite中使用'date('now')'。這是不正確的SQL(至少在SQLite中),它導致崩潰,而不是一個適當的錯誤。感謝您的幫助,但;事實證明,新版本幫助調試,即使它們都運行。 – 2010-10-21 22:29:22