[SOLVED] Problem with QSqlDatabase
-
wrote on 18 Dec 2013, 12:15 last edited by
Hi,
this is my very first post here and I think that it is fine to start a new thread for this problem because i have been searching for an aswer for 2 days now. I'm working with a little project where I am using sqlite database, which I created and I am not getting it to work. I have been working with databases only since this week's monday so there is much that I don't know yet but I am eager to learn.
So here is the code and hopefully someone can point me to right direction with it:
@bool User::getUser() {
bool ret = false;
db_ = QSqlDatabase::addDatabase("QSQLITE","userConnection");
db_.setDatabaseName("C:/Users/Jonne/Desktop/userDatabase.db.sqlite");// Some testing for the file QFileInfo fi("C:/Users/Jonne/Desktop/userDatabase.db.sqlite"); if(QFile::exists("C:/Users/Jonne/Desktop/userDatabase.db.sqlite")) { qDebug() << fi.filePath(); } if(db_.Open()) { qDebug() << "Database open."; QSqlQuery query("SELECT * FROM user;",db_); qDebug() << query.lastError(); if (query.first()) { name_ = query.value(1).toString(); age_ = query.value(2).toInt(); gender_ = query.value(3).toString(); height_ = query.value(4).toDouble(); weight_ = query.value(5).toDouble(); ret = true; } } db_.close(); return ret;
}@
With this code I am getting these outputs and errors:
@"userConnection"
QSqlError(-1, "Error opening database", "out of memory")
QSqlDatabasePrivate::removeDatabase: connection 'userConnection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'userConnection', old connection removed.
"userConnection"
QSqlError(-1, "Error opening database", "out of memory")
QSqlDatabasePrivate::removeDatabase: connection 'userConnection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'userConnection', old connection removed.
"userConnection"
QSqlError(-1, "Error opening database", "out of memory") @I don't for example understand why these errors are coming 3 times. I am getting the database from Desktop because I couldn't get it from the project directory.
Earlier I got a error message which said that there is not table named user in the database and that was when I tried to load the database from the project folder. Also I have a problem with qt-creator itself because as default it puts build and source files in the same directory and I couldn't get it to change the build directory.
Thanks in advance for any help. :)
-
wrote on 18 Dec 2013, 12:49 last edited by
About 3 times messages, I guess it is because somewhere in your program you call function getUser() at least three times. First time connection is created and every next time it is removed and created again.
The error "QSqlError(-1, "Error opening database", "out of memory")" can be caused by location of your database. In Windows 7 for folders under "Users" there are limited access rights. It is possible that your program have no right to create and/or modify database on this location. I suggest to change location of database to "C:\Test\userDatabase.db.sqlite" for example or some other folder.
-
wrote on 18 Dec 2013, 19:12 last edited by
That is the weird part because I am pretty sure that I call the getUser() function only 1 time but I don't know why the output looks like that. I changed the location of database as you suggested but the error message is still the same.
-
Hi and welcome to devnet,
First thing you should do is open your database connection only once at the start of your program since you are using SQLite. Then, if getUser is a slot, verify that you don't connect to it several times.
Hope it helps
-
wrote on 18 Dec 2013, 20:36 last edited by
Line 12 should be
@
if(db_.open()) { //lowercase "o"
@ -
wrote on 18 Dec 2013, 20:37 last edited by
So it would be a good way to make separate functions for example openDB() and something like that? Thanks I will give it a try.
Thanks to panoski also for pointing the mistake, I forgot it because I modified the code a bit.
-
wrote on 18 Dec 2013, 21:27 last edited by
I made separate function for opening the database and I call it at the begin of my program and it solved other problems except the one that matters the most so it doesn't open the database. The error messages in the output are: @QSqlError(-1, "Error opening database", "out of memory")
Unable to open input file: No such file or directory@Is there something wrong with my path or what could cause this?
I am now using this code to open the database:
@bool User::openDB() {
// Find QSLite driver db_ = QSqlDatabase::addDatabase("QSQLITE"); db_.setDatabaseName("C:/Databases/userDatabase.db.sqlite"); // Open databasee if(db_.open()) { return true; } else { qDebug() << db_.lastError(); return false; }
}@
-
How big is your database ?
-
wrote on 18 Dec 2013, 21:33 last edited by
The database is 2kB and contains only 1 row of User's information such as name and age.
-
wrote on 18 Dec 2013, 21:42 last edited by
And how did you modify the User::getUser() function?
-
wrote on 18 Dec 2013, 21:44 last edited by
The function is now like this:
@bool User::getUser() {
bool ret = false; if(db_.isOpen()) { QSqlQuery query("SELECT * FROM user;",db_); qDebug() << query.lastError(); if (query.first()) { name_ = query.value(1).toString(); age_ = query.value(2).toInt(); gender_ = query.value(3).toString(); height_ = query.value(4).toDouble(); weight_ = query.value(5).toDouble(); ret = true; } } return ret;
}@
-
wrote on 18 Dec 2013, 21:58 last edited by
And I think I should have specified before but I am making a Sailfish application here, does that affect to your advice a lot? Sorry if this was a vital information :/
-
wrote on 18 Dec 2013, 22:04 last edited by
I remember a post where a user had trouble with this QSqlQuery constructor. Try to change your function like this:
@
bool User::getUser() {bool ret = false; if(db_.isOpen()) { QSqlQuery query(db_); if(!query.exec("SELECT * FROM user")) qDebug() << query.lastError(); if (query.first()) { name_ = query.value(1).toString(); age_ = query.value(2).toInt(); gender_ = query.value(3).toString(); height_ = query.value(4).toDouble(); weight_ = query.value(5).toDouble(); ret = true; } } return ret;
}
@ -
wrote on 18 Dec 2013, 22:18 last edited by
I changed the function like you said but the database isn't open so I cant test this but it looks better, thanks.
-
wrote on 18 Dec 2013, 22:29 last edited by
Of course, the error prints when opening the database.... Anyway, I suppose you have also double-checked that the path and database file name are accurate.
-
Indeed you should have mention that earlier. Are you running this application on your Windows computer or on the Sailfish emulator/device ? In the second case I don't think it will access your hard drive to get the file hence the error "no such file or directory"
-
wrote on 18 Dec 2013, 22:50 last edited by
First in function OpenDB add this:
@ if(db_.open()) {
QStringList tables = db_.tables();
qDebug() << "Tables: " << tables;
return true;
} else {@This will show you all tables in your database if connection is successful.
- In the beginning of function getUser add this:
@QSqlDatabase db_ = QSqlDatabase::database();
if(db_.isOpen()) {
QSqlQuery query(db_);@
- In the beginning of function getUser add this:
-
wrote on 19 Dec 2013, 05:42 last edited by
Thanks for replies. I am running the application in Sailfish emulator and I think I should now get familiar with the usage of local storage and how to get database available for my Sailfish application. After that I can continue with these comments you have given.
-
wrote on 19 Dec 2013, 06:50 last edited by
I am a bit confused now. Does someone know how I could store my existing database to local storage and how I could refer to it and use it from my c++ class/object? I did found some examples on how to access database from QML but I would like to access my database from the c++ backend.
-
Hi,
This test code might help you
@
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);if(ConnectLocalDB()) GetData();
}
MainWindow::~MainWindow()
{
delete ui;
}bool MainWindow::ConnectLocalDB()
{
db = QSqlDatabase::addDatabase("QSQLITE");QString dbpath = "/root/testd.db"; db.setDatabaseName(dbpath); QSqlQuery query(QSqlDatabase::database()); query.exec("CREATE TABLE testtable (" "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," "testcolumn TEXT);" ); query.exec("insert into testtable(testcolumn) values('one')"); query.exec("insert into testtable(testcolumn) values('two')"); query.exec("insert into testtable(testcolumn) values('three')"); qDebug() << dbpath; return db.open();
}
bool MainWindow::GetData()
{
QSqlQuery query(QSqlDatabase::database());
QString q = "select * from testtable;";
query.exec(q);
while(query.next())
{
qDebug() << query.value(1).toString();
}
}
@
1/27