一.描述

QSqlDatabase提供了一系列的接口用于访问操作数据库,包括连接数据库,输入sql语句等。
QSqlDatabase的实例表示着一个对数据库的连接。该连接通过一个受支持的数据库驱动程序(从QSqlDriver派生)提供对数据库的访问。另外,可以从QSqlDriver子类化自己的数据库驱动程序。(如何创建自己的驱动,详见其他文档)
Qt支持的数据库有很多,自己首先接触到的是QODBC(用于sql server)。另外还有QDB2、QIBASE、QMYSQL等。

二.具体接口
  1. 连接到数据库
    (1)首先通过调用addDatabase()来创建一个连接,需要指定连接的驱动类型,也就是上述的Qt支持的数据库驱动。
    一个数据库可以被多个QSqlDatabase所连接。阅读文档时发现addDatabase()还有第二个参数,即连接名。当不指定第二个参数时,会创建默认的连接。
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
//创建数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","MyConnect"); 
//当存在一个连接时,也可以通过QSqlDatabase::database()获取,不指定参数时同样创建默认连接。
QSqlDatabase db = QSqlDatabase::database("MyConnect")

(2)在连接前需要绑定一系列的信息,包括主机名,数据库名,账号与密码。

//方式一
db.setDatabaseName(QString("DRIVER={SQL SERVER};"
			"SERVER=%1;" //服务器名称
			"DATABASE=%2;"//数据库名
			"UID=%3;"           //登录名
			"PWD=%4;"        //密码
		)
			.arg("hostname")
			.arg("databasename")
			.arg("loginname")
			.arg("password")
		);
//方式二
	  db.setHostName("hostname");
      db.setDatabaseName("databasename");
      db.setUserName("loginname");
      db.setPassword("password");
      //db.setPort("port");
      //db.setConnectOptions(); //各种设定,详见Qt帮助文档

(3)连接
把各种参数配置设定好后,需要调用open()去激活对数据库的连接。

dp.open();

QSqlDatabase的连接是通过连接名来标识的,而不是其连接数据库的名称。所以创建两个连接,但使用相同的连接名,则会出现覆盖情况。
如下先创建一个连接名为“DBConnect”的QSqlDatabase对象db,然后再创建一个相同连接名称的QSqlDatabase对象db_2,调试时会发现db连接已经失效,被db_2所覆盖,db_2可以正常使用。

	QSqlDatabase db;
	if (QSqlDatabase::contains("DbConnect"))
		db = QSqlDatabase::database("DbConnect");
	else
		db = QSqlDatabase::addDatabase("QODBC", "DbConnect");
	QSqlDatabase db_2 = QSqlDatabase::addDatabase("QODBC", "DbConnect");

因此如果需要创建多个数据库连接,则要在调用addDatabase()时为每个连接指定一个唯一的连接名称。可使用database(/ 连接名 /)获取该连接,使用removeDatabase(/* 连接名 */)删除连接。如果试图删除由其他QSqlDatabase对象引用的连接,QSqlDatabase将输出警告。可使用contains()查看给定的连接名称是否在连接列表中。

  1. 操作数据库
    详细接口详见Qt帮助文档,下面介绍QSqlQuery,用于输入sql语句。
QSqlQuery query(db); //传入QSqlDatabase实例

创建完成后,直接传入操作命令(SQL语句)即可,如下面例子:

bool jud = query.exec("if not exists(select * from sysobjects where name='test_table') create table test_table(id int primary key identity(1,1),name varchar(10),number varchar(10)");//查找数据库,若没有test_table这张表,就按输入要求创建该表。

若操作成功则会返回true,否则返回false。

三.注意事项

1.Qt文档中写道:
Warning: It is highly recommended that you do not keep a copy of the QSqlDatabase around as a member of a class, as this will prevent the instance from being correctly cleaned up on shutdown. If you need to access an existing QSqlDatabase, it should be accessed with database(). If you chose to have a QSqlDatabase member variable, this needs to be deleted before the QCoreApplication instance is deleted, otherwise it may lead to undefined behavior.

警告:强烈建议您不要将QSqlDatabase的副本作为类的成员保留,因为这将阻止在关闭时正确清理实例。如果需要访问现有的QSqlDatabase,则应使用database()访问它。如果选择使用QSqlDatabase成员变量,则需要在删除QCoreApplication实例之前删除该变量,否则可能导致未定义的行为。

这里不太懂,什么叫QSqlDatabase的副本作为类成员保留。是指QSqlDatabase不可以作为类成员吗,即使用时需要每次创建临时变量然后通过database()去获取数据库连接?
目前上述两种方法都试过,均能够成功连接并进行数据库操作。

2.注意一定要把下面的文件放置到.exe下,不然会缺少驱动无法连接到数据库,不会报错,但是就是一直连不上!这个错误找了我半天。。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐