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

Linux 在QT下打开现有的sqlite3数据库,linux,qt,sqlite,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("? "); a

我对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:
;
}
请注意,在adddatabase之后,我没有得到这样的文件或目录,根本不知道它在谈论哪个文件。还请注意,isOpen和open正在返回true???。数据库未打开错误来自db.exec调用…我想


急需指导…

不带参数的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;
}

不带参数的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;
}

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

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

perror只能在调用一个实际失败的系统函数并在失败时设置errno之后使用。Qt不会这样做

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

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;
    }
}
我甚至还没有试着编译这个,所以


请看一下,看看他们是如何处理这些问题的。

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

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

perror只能在调用一个实际失败的系统函数并在失败时设置errno之后使用。Qt不会这样做

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

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;
    }
}
我甚至还没有试着编译这个,所以


请看一下,看看他们是如何处理所有这些的。

好的,我使用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:
;

好的,我使用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:
;

如果数据库已正确打开,请检查exec的结果。然后使用lastError检查。我这样做了,exec调用打印数据库未打开错误,这是我在上面问题中发布的第三个错误。lastError返回无效的参数错误。如果数据库已正确打开,请检查exec的结果。然后使用lastError检查。我这样做了,exec调用打印数据库未打开错误,这是我在上面问题中发布的第三个错误。最后一个错误返回无效的参数错误。谢谢伙计。。。我试过了。谢谢你,伙计。。。我试过了。qDebug如果你打算接受修改后的代码,请在没有所有内容的情况下发布修改后的代码,特别是回答中的perror内容,否则其他人可能会认为你问题中的代码是有效的
,但事实并非如此。事实上,我以前的代码正在工作。我所做的只是在不同的数据库文件上尝试相同的代码:。但是我发布代码只是为了以防万一……避免混淆。对不起,你的代码不好。您正在分配一个QSQL数据库,然后立即将其丢弃。QSqlError也是这样。您通过一个指针使用QSqlDatabase,而这不是您应该如何使用它。您没有检查query.execute的返回值,这是错误的做法。你有一个无用的GOTO,这是非常糟糕的练习,特别是在C++中。如果数据库无法打开,就不会中断程序流,这是一种糟糕的做法。对不起,我发了-1。我只发了答案中有用的部分代码。我同意,后藤很危险,我应该避开它们。但是我用它来打破上面的功能,代码底部的标签是我跳转的地方,取消分配资源,然后退出。就像我说的,我对C++和OOP很陌生。顺便说一句,为什么使用指针访问数据库是错误的?这不是错误的,这不常见。这与样品的制作方式无关。它会导致代码泄漏。GOTOS在C++中比C更难获得,如果你不做清理,那么在函数的末尾就没有任何意义了。如果你打算接受它,请在没有答案的情况下发布你的修正代码。如果其他人可能认为你的问题中的代码是有效的,那么答案就在你的答案中。事实并非如此,事实上,我之前的代码正在运行。我所做的只是在不同的数据库文件上尝试相同的代码:。但是我发布代码只是为了以防万一……避免混淆。对不起,你的代码不好。您正在分配一个QSQL数据库,然后立即将其丢弃。QSqlError也是这样。您通过一个指针使用QSqlDatabase,而这不是您应该如何使用它。您没有检查query.execute的返回值,这是错误的做法。你有一个无用的GOTO,这是非常糟糕的练习,特别是在C++中。如果数据库无法打开,就不会中断程序流,这是一种糟糕的做法。对不起,我发了-1。我只发了答案中有用的部分代码。我同意,后藤很危险,我应该避开它们。但是我用它来打破上面的功能,代码底部的标签是我跳转的地方,取消分配资源,然后退出。就像我说的,我对C++和OOP很陌生。顺便说一句,为什么使用指针访问数据库是错误的?这不是错误的,这不常见。这与样品的制作方式无关。它会导致代码泄漏。Gotos在C++中比C更难得到正确的答案,如果你不清理函数,那么在函数的末尾做一个Goto就没有意义了。我很困惑。您可能想试试我添加到答案中的代码。这将创建数据库、创建表、插入示例行和查询。请报告输出。请尝试一下,其打印id=1,text=Some text作为结果,是否正确?我还是一个初学者,所以我还不了解addBindValue是如何工作的,因此我不了解打印结果。是的,这是正确的。如果您再次运行它,您将看到每次执行多出一行。文本是常量,整数将始终递增。所以一切正常。尝试使用此代码打开数据库,删除创建新表的零件和插入新行的零件。将查询中的测试替换为您的表名,然后再次测试。工作完美男人!!!。只是好奇…为什么用指针访问数据库不好?你是说QSqlDatabase吗?我不认为这是一个问题,就我记忆所及,从来没有用过这种方式,但我认为它是好的。只需正确处理连接的拆卸。这是一个相当微妙的问题。有关解释,请参阅Qt文档中的removeDatabase。我很困惑。您可能想试试我添加到答案中的代码。这将创建数据库、创建表、插入示例行和查询。请报告输出。请尝试一下,其打印id=1,text=Some text作为结果,是否正确?我还是一个初学者,所以我还不了解addBindValue是如何工作的,因此我不了解打印结果。是的,这是正确的。如果您再次运行它,您将看到每次执行多出一行。文本是常量,整数将始终递增。所以一切正常。尝试使用此代码打开数据库,删除创建新表的零件和插入新行的零件。将查询中的测试替换为您的表名,然后再次测试。工作完美男人!!!。只是好奇…为什么用指针访问数据库不好?你是说QSqlDatabase吗?我不认为这是一个问题,就我记忆所及,从来没有用过这种方式,但我认为它是好的。只需正确处理连接的拆卸 . 这是一个相当微妙的问题。有关说明,请参阅Qt文档中的removeDatabase。