【问题标题】:QtSql connectionQtSql 连接
【发布时间】:2013-06-18 15:12:55
【问题描述】:

我正在尝试创建与数据库的连接并对数据库进行插入/删除/查询。我对 SQL 比较了解,但我似乎无法在 Qt 中完全理解它。我以前用 Delphi 编程。

这是我目前的代码:

QSqlDatabase db;
db.addDatabase("QSQLITE");
db.setHostName( "localhost" ); //I don't know if i should include this the database is in the same directory as my program
db.setDatabaseName( "Xmato.odb" );
db.setUserName( "" ); //There is no username
db.setPassword( "" ); //There is no password
db.open();
db.prepare("SELECT * FROM Members");
db.exec();

我已将此添加到我的 .pro 文件中:

QT += sql;

一个包含在我的主文件中的 QtSql。

当我运行这段代码时,我得到了错误:

QSqlQuery::prepare: database not open

任何想法我都会非常感激。

P.S.:我在 Linux Ubuntu 12.04 上使用 c++,并使用 LibreOffice Base 创建我的数据库。

【问题讨论】:

  • prepare() 通常在您调用存储过程并希望稍后传递参数时使用。如果您删除带有prepare() 语句的行并将最后一条语句更改为:db.exec("SELECT * FROM Members");,您会得到什么?
  • db.open() 是否返回 true,如果不是,则表明有错误,错误描述是什么(db.lastError().text() 返回)?对于Sqlite,可以省略setHostNamesetUserNamesetPassword,这些函数什么都不做。
  • @RobbieE 我确实在程序中使用了参数。我只是为这个问题简化了它
  • @alexisdm 它说“驱动程序未加载”。驱动程序是什么,我应该使用哪一个?
  • 这看起来可能是某种 Microsoft Access 或 OpenOffice/LibreOffice 数据库,而不是 SQLite。在此处查看更多信息:hsqldb.org。据我所知,这个数据库后端只有一个Java接口。

标签: c++ qt qtsql


【解决方案1】:

经过一番 google-ing - openoffice libre 的内部数据库正在使用 HSQLDB(Java 的自然选择)。 Here's a small discussion about HSQLDB.

似乎某些版本的 openlibre base 也能够连接到 external databases. 我建议设置更易于 C++ 访问的东西,特别是 Qt。

Only a few drivers like ODBC & SQLite is included by default.

这意味着根据所使用的数据库,可能需要获取额外的源代码(或包)并编译插件/dll/so。该库由 QtSql 模块动态加载(即运行时)。我遇到了mysql drivers

当您完成所有设置后,您对 addDatabase 的调用应该与您正在使用的数据库类型相匹配。

QSqlDatabase::addDatabase( "QODBC" );  // For something like MSSQL
QSqlDatabase::addDatabase( "QSQLITE" );  // For SQLite
QSqlDatabase::addDatabase( "QMYSQL" );  // For MySQL

就个人而言,如果您只是为了好玩,那么 SQLITE 就是一个快速简单的数据库。 You can even download plugins/extensions for Mozilla Firefox that will offer you a GUI to the database.

【讨论】:

  • 非常感谢。我现在明白了很多。我会做一些研究,现在我知道要寻找什么了。再次感谢。
【解决方案2】:

驱动程序未加载

您需要 QSQLITE 驱动程序。

db.drivers() 返回所有可用数据库驱动程序的列表。

在 Ubuntu 12.04 中,sqlite 的驱动程序位于名为 libqt4-sql-sqlite 的包中。

但是:odb 是一个 sqlite 数据库吗??

【讨论】:

  • 我想说,您可以为 db 文件使用任何扩展名。它只会更改操作系统用来打开它的默认应用程序,但是由于结构是一个 sqlite 数据库,因此将其命名为 'db.run' 并尝试安装它会引起一些麻烦
【解决方案3】:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName( "Xmato.odb" );
if (db.open())
{
    QSqlQuery query(db); // if multiple connections used, without the `db` in constructor    will cause the query to use the default database (first opened and available one)
    query.exec("select * from members");
}

应该这样做。不需要用户名和密码,因为它是一个文件,你只需要使用setDatabaseName 来设置你要打开的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多