在QT下打开现有的sqlite3数据库

时间:2011-10-19 07:25:57

标签: linux qt sqlite

我是QT和SQLite DBMS的新手。我正在尝试打开在ubuntu Linux下使用“sqlite3”命令行程序创建的现有数据库。我尝试使用以下代码在QT下访问的相同数据库:

void MainWindow::func()
{
    QSqlQuery query;
    accounts_db = new QSqlDatabase();
    *accounts_db = QSqlDatabase::addDatabase("QSQLITE");
    perror("? ");
accounts_db->setDatabaseName("/home/user/xyz.db");
QSqlError *a = new QSqlError();
*a = accounts_db->lastError();
perror(a->text().toLatin1());
if (!accounts_db->open()) {
    perror("database open error :");
}
if ( !accounts_db->isOpen() ) {
    perror("database is not open");
}
query.exec("select accno,branchcode,fname,lname,curbalance,accdate from accounts");
while(query.next()) {
    QString str = query.value(0).toString();
    std::cerr << qPrintable(str) << std::endl;
}
end:
;
}

此操作失败并出现以下错误...

No such file or directory
: Invalid argument
QSqlQuery::exec: database not open

请注意,在adddatabase()之后我得到“没有这样的文件或目录”,不知道它在说什么文件。还要注意isOpen()和open()返回“true”(???)。 “数据库未打开”错误来自db.exec()调用(...我想......)。

迫切需要指导......

3 个答案:

答案 0 :(得分:5)

没有参数的QSqlQuery构造函数使用应用程序的默认数据库。也许还没有确定。使用构造函数指定查询需要使用的数据库:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connection_name");
// Open db...
QSqlQuery query(db);
if (!query.exec(...)) {
   // ...
}
// ...

注意事后关闭连接的方式。

编辑:这是我刚刚编写的一个测试,正在处理我的系统。你可能想试试。

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>

int main(int argc, char *argv[])
{
    // Create database.
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Connection");
    db.setDatabaseName("/tmp/test.db");
    if (!db.open()) {
        qDebug("Error occurred opening the database.");
        qDebug("%s.", qPrintable(db.lastError().text()));
        return -1;
    }

    // Insert table.
    QSqlQuery query(db);
    query.prepare("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, text TEXT)");
    if (!query.exec()) {
        qDebug("Error occurred creating table.");
        qDebug("%s.", qPrintable(db.lastError().text()));
        return -1;
    }

    // Insert row.
    query.prepare("INSERT INTO test VALUES (null, ?)");
    query.addBindValue("Some text");
    if (!query.exec()) {
        qDebug("Error occurred inserting.");
        qDebug("%s.", qPrintable(db.lastError().text()));
        return -1;
    }

    // Query.
    query.prepare("SELECT * FROM test");
    if (!query.exec()) {
        qDebug("Error occurred querying.");
        qDebug("%s.", qPrintable(db.lastError().text()));
        return -1;
    }
    while (query.next()) {
        qDebug("id = %d, text = %s.", query.value(0).toInt(),
               qPrintable(query.value(1).toString()));
    }

    return 0;
}

答案 1 :(得分:1)

这主要是猜测,因为你的代码在很多方面都是错误的,包括错误报告。

最可能的问题是您的文件路径不正确,或者您运行应用程序的用户对文件和/或目录没有适当的权限。 (注意:Linux中的文件和目录区分大小写。)

perror只应在调用实际失败的系统函数后使用,并在调用errno时设置。{p> void MainWindow::func() { // Note: no pointer! QSqlDatabase accounts_db = QSqlDatabase::addDatabase("QSQLITE"); accounts_db.setDatabaseName("/home/user/xyz.db"); if (!accounts_db.open()) { qDebug() << "Could not open database file:"; qDebug() << accounts_db.lastError(); return; } // Note: don't construct queries before you have a database! QSqlQuery query; if (!query.exec("select accno,branchcode,fname,lname,curbalance,accdate from accounts")) { qDebug() << "Query failed:"; qDebug() << query.lastError(); return; } while(query.next()) { QString str = query.value(0).toString(); std::cerr << qPrintable(str) << std::endl; } } 。 Qt不这样做。

请尝试运行此操作,如果仍无法解决问题,请更新您的问题:

{{1}}

(我甚至没有尝试编译这个,所以YMMV。)

还要查看SQL examples,看看他们如何处理这一切。

答案 2 :(得分:-1)

好吧,我使用 sqlite3 命令创建了一个全新的数据库文件,现在我的问题中的相同程序正在运行!!!

我以前也试过这个,但是那个时候它不起作用(......当发生这种情况时我讨厌它)。我猜以前的文件可能已损坏。但是以前的数据库文件可以从cmdline sqlite3程序访问,所以我假设该文件没问题,但显然没有。

无论如何,感谢很多人给我时间,非常抱歉,如果我浪费了它:(。

我将此标记为答案,只是为了清楚起见这个问题得到了回答。但它不完全是答案(...因为我仍然不明白发生了什么!?)

再次感谢...

编辑:

这是代码

QSqlError *a = new QSqlError();

accounts_db = new QSqlDatabase();
*accounts_db = QSqlDatabase::addDatabase("QSQLITE");

accounts_db->setDatabaseName("/home/user/test.db");

if ( !accounts_db->open() ) {
    qDebug() << accounts_db->lastError();
    qDebug() << "Could not open database file:";
}
QSqlQuery query;

if ( !(accounts_db->isOpen()) ) {
    qDebug() << accounts_db->lastError();
    qDebug() << ": Could not open database file:";
    goto end;   // quit if not successful
}

query.exec("select * from accounts");

while(query.next()) {
    // loop for i columns
    QString str = query.value(i).toString();
    std::cerr << qPrintable(str) << std::endl ;
    // loop
}
end:
;