我有三個查詢,我通過SQLite運行。這些就是我正在運行的;第一個是表格聲明,接下來的3個是實際的查詢。SQLite崩潰插入項目
聲明:
「CREATE TABLE IF NOT EXISTS項目(busid INTEGER PRIMARY KEY,IP地址文本,時間TEXT DEFAULT(NOW()));」
查詢:
- (工程) 「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;
}
剛剛成立的源代碼,無論你想它來創建測試數據庫的數據庫路徑。
我有AV長使&&sudo make install運行,所以我想要的東西來打發時間:-) – pm100 2010-10-21 20:33:07
好吧,我試過最新版本的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