Reputation: 69
I'm working on qt, my database was rightly connected with qt but suddenly i have the following problem every time i debug,,,i i become not able to fetch or to add data from/to the database,,, i don't know whats's the matter but i'm new to qt.
QSqlQuery::exec: database not open
could anybody help please ,,it's an emergency case here the code
db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:/Users/user/Desktop/Final_Version/db.accdb");
db.close();
db.open();
QSqlQuery query;
query.exec("Select ID from TestId");
while(query.next())
{
TestId = query.value(0).toInt();
}
db.close();
//==================================================================================
Upvotes: 4
Views: 21449
Reputation: 9
try not to use db.open() check the database opened or not. It's not that accurate, check this out, after the check you might be able use db.open() and exec(command) normally(link with query first).
QSqlQueryModel *model = new QSqlQueryModel;
if (db.isValid())
{
db.open();
if (db.isOpen())
{
QSqlQuery query(db);
query.prepare("SELECT * FROM version_chart");
query.exec();
if (query.isActive())
{
model->setQuery(query);
db.close();
qDebug() << "opened success\n";
}
else {
qDebug() << "query is not active:DB being occupied, close manually";
qDebug() << db.lastError().text();
qFatal("failed to connect.");
return false;
}
}
else {
qDebug() << "DB is not open";
return false;
}
}
else {
qDebug() << "DB is not valid";
return false;
}
Here's also another way I'm using right now. I may simply change the file name and check if it succeed.
if (isFileUsed(origin_path))
{
qDebug() << "Warning: File being occupied!" << "\n";
QMessageBox::critical(0,"File Open Error", "File occupied, please close and retry!",
QMessageBox::Ok, 0);
return false;
}
bool Save_DB::isFileUsed(QString fpath)
{
bool isUsed = false;
QString fpathx = fpath + "x";
QFile file(fpath);
bool isExist = file.exists();
if (isExist == true)
{
bool isCanRename = file.rename(fpath, fpathx);
if (isCanRename == false)
{
isUsed = true;
}
else
{
file.rename(fpathx, fpath);
}
}
file.close();
return isUsed;
}
Upvotes: 1
Reputation: 295
You need to add qsql dll files for Microsoft Access Driver within your sqldrivers folder
Check following if you are debugging
If you are distributing your app, you just copy sql driver folder also with your executable along with required dlls.
edit your QSqlQuery object binded with database connection
db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb};FIL={MSAccess};DBQ=C:/Users/user/Desktop/Final_Version/db.mdb");
database.open();
QSqlQuery query(db);
query.exec("Select ID from TestId");
while(query.next())
{
TestId = query.value(0).toInt();
}
db.close();
I think, some of this will help you... :)
Upvotes: 3
Reputation: 81
QSqlQuery *query = new QSqlQuery(db);
I think that can help you! :)
Upvotes: 8