我第一次尝试插入行时,我的Sqlite连接器工作得很好,但是在它关闭后再次运行程序时,它根本无法工作。
这是我的构造函数
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");
}
答案 0 :(得分:1)
啊,您正在尝试使用相同的ID创建新记录。 ID通常是唯一的。试试:
db.create_ART(2, "Chill day", "Peter", "Sunday afternoon is pretty chill");