[英]Sqlite3 C++ database is locked
我想修改數據庫中一行的記錄,但不知何故我得到一個database is locked
錯誤
void Bookshop::modifyBookRecords () {
std::cout << "You want to modify a book" << std::endl;
std::cout << "Title/ISBN: ";
std::string input;
std::getline (std::cin, input);
bool isAvailable = database.checkAvailability (input);
database.closeDb ();
if (isAvailable) {
std::cout << "Title: ";
std::string title;
std::getline (std::cin, title);
std::cout << "Author: ";
std::string author;
std::getline (std::cin, author);
std::cout << "Pages: ";
int pages;
std::cin >> pages;
std::cin.ignore (std::numeric_limits<std::streamsize>::max (), '\n');
std::cout << "Genre: ";
std::string genre;
std::getline (std::cin, genre);
std::cout << "Publisher: ";
std::string publisher;
std::getline (std::cin, publisher);
std::cout << "ISBN: ";
std::string isbn;
std::getline (std::cin, isbn);
std::cout << "Number of Copies: ";
int numberOfCopies;
std::cin >> numberOfCopies;
std::cin.ignore (std::numeric_limits<std::streamsize>::max (), '\n');
database.updateRecord (input, title, author, pages, genre, publisher, isbn, numberOfCopies);
}
else {
std::cout << "The book was not found" << std::endl;
}
}
CheckAvailability 方法
bool Database::checkAvailability (std::string& input) {
openDb (dir);
sqlite3_stmt* stmt;
rc = sqlite3_prepare_v2 (db, "SELECT * FROM Books WHERE Title = ? OR Isbn = ?", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
std::cout << sqlite3_errmsg (db);
closeDb ();
return false;
}
sqlite3_bind_text (stmt, 1, input.c_str (), input.length (), NULL);
sqlite3_bind_text (stmt, 2, input.c_str (), input.length (), NULL);
if (sqlite3_step (stmt) == SQLITE_ROW) {
return true;
sqlite3_finalize (stmt);
sqlite3_close (db);
}
else {
return false;
sqlite3_finalize (stmt);
sqlite3_close (db);
}
}
更新記錄方法
// Method updates the whole row with the values from the parameter list
void Database::updateRecord (const std::string& input,
const std::string& title,
const std::string& author,
const int& pages,
const std::string& genre,
const std::string& publisher,
const std::string& isbn,
const int& numberOfCopies) {
openDb (dir);
sqlite3_stmt* stmt;
rc = sqlite3_prepare_v2 (db, "UPDATE Books SET Title = ?, Author = ?, Pages = ?, Genre = ?, Publisher = ?, Isbn = ?, Copies = ? WHERE Title = ? OR Isbn = ?", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
std::cerr << sqlite3_errmsg (db);
closeDb ();
}
sqlite3_bind_text (stmt, 1, title.c_str (), title.length (), NULL);
sqlite3_bind_text (stmt, 2, author.c_str (), author.length (), NULL);
sqlite3_bind_int (stmt, 3, pages);
sqlite3_bind_text (stmt, 4, genre.c_str (), genre.length (), NULL);
sqlite3_bind_text (stmt, 5, publisher.c_str (), publisher.length (), NULL);
sqlite3_bind_text (stmt, 6, isbn.c_str (), isbn.length (), NULL);
sqlite3_bind_int (stmt, 7, numberOfCopies);
sqlite3_bind_text (stmt, 8, input.c_str (), input.length (), NULL);
sqlite3_bind_text (stmt, 9, input.c_str (), input.length (), NULL);
rc = sqlite3_step (stmt);
if (rc != SQLITE_OK) {
std::cerr << sqlite3_errmsg (db);
}
else {
std::cout << "books was updated successfully" << std::endl;
}
sqlite3_finalize (stmt);
closeDb ();
}
錯誤出現在 checkAvailability 方法中,因為當我刪除它時,一切正常。 有人告訴我,數據庫是在某處打開的,所以后面的方法中是不允許打開的。 但是我在 checkAvailability() 結束時關閉了數據庫,所以我不知道問題所在。
您在關閉數據庫之前從checkAvailability
返回。 從 function 返回后,不會執行返回語句之后的語句。 控制流回到 function 的調用者。
bool Database::checkAvailability (std::string& input) {
openDb (dir);
sqlite3_stmt* stmt;
rc = sqlite3_prepare_v2 (db, "SELECT * FROM Books WHERE Title = ? OR Isbn = ?", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
std::cout << sqlite3_errmsg (db);
closeDb ();
return false;
}
sqlite3_bind_text (stmt, 1, input.c_str (), input.length (), NULL);
sqlite3_bind_text (stmt, 2, input.c_str (), input.length (), NULL);
if (sqlite3_step (stmt) == SQLITE_ROW) {
sqlite3_finalize (stmt);
sqlite3_close (db);
return true;
}
else {
sqlite3_finalize (stmt);
sqlite3_close (db);
return false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.