與C++

2012-08-14 21 views
2

SQLite的插入語句下面是我在測試2.cpp與C++

我檢查我的數據庫,發現沒有加入新的記錄嘗試的代碼。我的發言中究竟發生了什麼錯誤?

#include <iostream> 
#include <sqlite3.h> 

//g++ -o test2 test2.cpp -lsqlite3 
using namespace std; 

int main() 
{ 
int counter = 0; 

    sqlite3 *db; 
    sqlite3_stmt * stmt; 

string username = "panda"; 
string name = "Kungfu Panda"; 
string department = "normal"; 
string password = "hellopassword"; 

string sqlstatement = "INSERT INTO abe_account (" + username + "," + name + "," + department + "," + password + ");"; 

    if (sqlite3_open("abeserver.db", &db) == SQLITE_OK) 
    { 
    sqlite3_prepare(db, sqlstatement.c_str(), -1, &stmt, NULL);//preparing the statement 
    sqlite3_step(stmt);//executing the statement 
     } 
    else 
    { 
     cout << "Failed to open db\n"; 
    } 

    sqlite3_finalize(stmt); 
    sqlite3_close(db); 


    return 0; 

} 

我想問一下是否有可能知道語句是否成功執行。像添加了一行,從sqlite3的某種形式的確認。如果出現錯誤,它是否也能夠得到滿足?

+0

在SQL中缺少'VALUES'? – 2012-08-14 05:03:00

+0

[您可以創建數據庫,表以及將數據插入表] [1] [1]:http://stackoverflow.com/questions/10540728/creating-an-sqlite3-database-file-通過目標C/11795399#11795399 希望它會幫助你。 – 2012-08-14 05:33:43

回答

2

當你插入時,通常指定的字段按照您要提供數據的順序排列。否則,您必須以正確的順序指定所有數據(按照定義的順序傳遞表中所有字段的值)。

你的語法是不完整的,因此無論是...這樣做:

INSERT INTO tablename (field1, field2, field3) VALUES (value1, value2, value3); 

或者這樣:

INSERT INTO tablename VALUES (value1, value2, value3) 

而且,因爲你不是將數據綁定到一個準備好的查詢,您需要引用你的琴絃。用panda代替用戶名是不好的。您需要提供'panda'。因此,串進去這樣的:

"('" + username + "','" + name + "','" + department + "','" + password + "');" 

因爲它很容易搞砸(也有轉義碼的特殊字符,單引號),你可能更喜歡做一個功能引用這在非常至少會做字符串:

string quotesql(const string& s) { 
    return string("'") + s + string("'"); 
} 

然後:

"(" + quotesql(username) + "," + quotesql(name) + ... 

所以,最後你可能會得到這個(假設字段名稱):

string sqlstatement = 
    "INSERT INTO abe_account (username, name, department, password) VALUES (" 
    + quotesql(username) + "," 
    + quotesql(name) + "," 
    + quotesql(department) + "," 
    + quotesql(password) + ");"; 
1

嘗試添加在你的字符串一些單引號:

​​

不熟悉sqllite,但通常一個INSERT樣子:

string sqlstatement = "INSERT INTO abe_account (ColumnName1, ColumnName2, ColumnName3, ColumnName4) VALUES ('" + username + "','" + name + "','" + department + "','" + password + "');"; 
0

是的,你可以知道爲什麼它的失敗。

包括 「sqlite_exception.h」

遵循這樣:

int m = sqlite3_step(stmt); 
if(m == SQLITE_BUSY) 
{ 

/*嘗試使用的老毛病又犯sqlite3_step,具有延遲睡眠()**/ }

if(m == SQLITE_ERROR) 
    std::cout(sqlite3_sql(stmt), sqlite3_errmsg(db)); 
if(m == SQLITE_MISUSE) 
    std::cout(sqlite3_sql(stmt), sqlite3_errmsg(db)); 

看看這些: http://www.sqlite.org/c3ref/c_abort.html