2017-04-19 91 views
-1

我第一次尝试插入行时,我的Sqlite连接器工作得很好,但是在它关闭后,我再次运行该程序根本无法工作。sqlite3将不会工作第二次

这里是我的构造

Sqldatabase::Sqldatabase() { 
    open_connection("Database.db"); 

    sqlite3_stmt *statement; 
    std::string sql = "SELECT id FROM articles ORDER BY id DESC LIMIT 1"; 
    char *query = &sql[0]; 
    if(sqlite3_prepare_v2(db, query, -1, &statement, 0) == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { 
    article_counter = sqlite3_column_int(statement, 0) + 1; 
    } else { 
    article_counter = 1; 
    } 
} 

这是我preparedStatement时方法。

bool Sqldatabase::prepareStatement(std::string sql) { 
    char *query = &sql[0]; 
    sqlite3_stmt *statement; 
    int result; 

    if (sqlite3_prepare_v2(db, query, sql.size(), &statement, 0) == SQLITE_OK) { 
    result = sqlite3_step(statement); 
    std::cout << sql << '\n'; 
    sqlite3_finalize(statement); 
    if(result == SQLITE_DONE) { 
     return true; 
    } 
    } 
    std::cout << "SQL failed: " << sql << '\n'; 
    return false; 
} 

最后,这里是我称之为方法的地方。

bool Sqldatabase::create_ART(int ng_id, std::string title, std::string author, std::string text) { 
    //Creating article 
    std::ostringstream s; 
    s << "INSERT INTO articles (id, title, author, content, created) " << 
     "VALUES (" << article_counter << ", '" << title << "', '" << author << "', '" << text << "' , CURRENT_DATE)"; 
    std::string sql(s.str()); 
    prepareStatement(sql); 

    //Adding article to newsgroup 
    std::ostringstream t; 
    t << "INSERT INTO contains VALUES (" << article_counter << " , " << ng_id << ")"; 
    std::string sql2(t.str()); 
    article_counter++; 
    return prepareStatement(sql2); 
} 

我的测试脚本如下所示。我已经在数据库中有一个ID为1的新闻组。

Sqldatabase db; 

int main(int argc, char* argv[]){ 
    std::cout << "-----Test of Memdatabase, Newsgroup and Article classes-----" << std::endl; 
    db = Sqldatabase(); 

    db.create_ART(1, "Happy day", "John", "Sunday afternoon is pretty chill"); 
    db.create_ART(1, "Chill day", "Peter", "Sunday afternoon is pretty chill"); 

} 

回答

1

啊,你正在尝试创建一个具有相同ID的新记录。 ID通常是独一无二的。请尝试:

db.create_ART(2, "Chill day", "Peter", "Sunday afternoon is pretty chill"); 
+1

复制粘贴编程的危害之一。 –

+0

我以前也是这么想的,但是这个id是文章所要插入的新闻组的id。第一个INSERT语句根本不使用ng_id:/所有SQL语句似乎都失败(更新,删除,插入),但select语句仍然工作。 – iSadist

+0

好的,你确定数据库没有在id列中实施唯一的条目吗? – AlphaTested

相关问题