设为首页 收藏本站
查看: 799|回复: 0

[经验分享] QT开发(四十八)——数据库SQL接口层

[复制链接]

尚未签到

发表于 2018-10-21 06:18:48 | 显示全部楼层 |阅读模式
QT开发(四十八)——数据库SQL接口层
  SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互。
一、QSqlDatabase
1、QSqlDatabase简介
  QSqlDatabase类提供了通过连接访问数据库的接口,QSqlDatabase对象本身代表一个连接,连接通过QT支持的数据库驱动提供对数据库的访问。
2、QSqlDatabase成员函数
  QSqlDatabase::QSqlDatabase(const QSqlDatabase &other)
  [protected] QSqlDatabase::QSqlDatabase(const QString &type)
  [protected] QSqlDatabase::QSqlDatabase(QSqlDriver *driver)
  使用给定的驱动创建一个数据库连接
  [static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))
  根据给定的数据库驱动类型type、数据库连接名connectionName 创建一个数据库连接,如果有已经存在的同名连接,则新建立连接替换旧连接;如果没有指定数据库连接名,则新建立的数据库连接将成为应用程序的默认连接。
  [static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String( defaultConnection ))
  根据给定的数据库驱动driver、连接名connectionName 创建数据库连接
  [static] QSqlDatabase QSqlDatabase::cloneDatabase(const QSqlDatabase &other, const QString &connectionName)
  根据数据库连接other克隆创建一个名字为connectionName的数据库连接
  void QSqlDatabase::close()
  关闭数据库连接,释放申请的任何资源,数据库使用的任何QSqlQuery对象将无效
  bool QSqlDatabase::commit()
  如果数据库驱动支持事务机制并且已经启动,提交事务给数据库。对于某些数据库,如果有一个使用数据库的活跃查询SELECT,提交将会失败,返回false。在提交前需要确保查询不在活跃。
  QString QSqlDatabase::connectOptions() const
  返回连接选项使用的字符串
  QString QSqlDatabase::connectionName() const
  返回连接名
  [static] QStringList QSqlDatabase::connectionNames()
  返回包含所有连接的名字的链表
  [static] bool QSqlDatabase::contains(const QString &connectionName = QLatin1String( defaultConnection ))
  如果数据库连接的链表中包含connectionName 连接,返回true
  [static] QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true)
  返回名字为connectionName 的数据库连接。数据库连接需事先添加,如果open为true,并且数据库连接没有打开,则调用本函数时打开连接。如果connectionName没有指定,返回默认的链接;如果connectionName不存在数据库链表中,返回非法的链接
  QString QSqlDatabase::databaseName() const
  返回连接的数据库名字
  QSqlDriver *QSqlDatabase::driver() const
  返回用于数据库连接访问的数据库驱动
  QString QSqlDatabase::driverName() const
  返回连接的驱动名字
  [static] QStringList QSqlDatabase::drivers()
  返回所有可用的数据库驱动的链表
  QSqlQuery QSqlDatabase::exec(const QString &query = QString()) const
  在数据库执行一条SQL语句query,返回QSqlQuery对象
  QString QSqlDatabase::hostName() const
  返回连接的主机名
  [static] bool QSqlDatabase::isDriverAvailable(const QString &name)
  如果驱动name可用,返回true
  bool QSqlDatabase::isOpen() const
  如果数据库连接目前打开,返回true
  bool QSqlDatabase::isOpenError() const
  如果在打开数据库连接时发生错误,返回true
  bool QSqlDatabase::isValid() const
  如果QSqlDatabase连接有一个合法的驱动,返回true
  QSqlError QSqlDatabase::lastError() const
  返回数据库发生的最后一个错误的信息
  QSql::NumericalPrecisionPolicy QSqlDatabase::numericalPrecisionPolicy() const
  返回数据库连接当前的默认精度策略
  bool QSqlDatabase::open()
  使用当前的连接值打开数据库连接
  bool QSqlDatabase::open(const QString &user, const QString &password)
  使用给定的用户名和密码打开数据库连接
  QString QSqlDatabase::password() const
  返回数据库连接的密码
  int QSqlDatabase::port() const
  返回数据库连接的端口号
  QSqlRecord QSqlDatabase::record(const QString &tablename) const
  返回表tablename中所有字段的名字的记录
  [static] void QSqlDatabase::registerSqlDriver(const QString &name, QSqlDriverCreatorBase *creator)
  在SQL框架内注册新的名字为name的SQL驱动
  [static] void QSqlDatabase::removeDatabase(const QString &connectionName)
  从数据库连接链表中删除名字为connectionName的数据库连接
  bool QSqlDatabase::rollback()
  中止数据库上的一件事务
  void QSqlDatabase::setConnectOptions(const QString &options = QString())
  设置数据库指定选项,必须在连接打开之前或是连接失效时完成
  void QSqlDatabase::setDatabaseName(const QString &name)
  设置连接的数据库名字为name,为了生效,必须在连接被打开前设置。
  void QSqlDatabase::setHostName(const QString &host)
  设置连接的主机名为host,为了生效,必须在连接被打开前设置。
  void QSqlDatabase::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
  在创建的数据库连接上设置默认的数字精度策略,用于查询。在当前活跃的查询上设置将无效
  void QSqlDatabase::setPassword(const QString &password)
  设置连接的密码,需要在连接打开前设置
  void QSqlDatabase::setPort(int port)
  设置连接的端口号,需要在连接打开前设置
  void QSqlDatabase::setUserName(const QString &name)
  设置连接的用户名,需要在连接打开前设置
  QStringList QSqlDatabase::tables(QSql::TableType type = QSql::Tables) const
  返回由type指定的数据库的表、系统表和视图的链表
  bool QSqlDatabase::transaction()
  如果数据库驱动支持事务机制,在数据库上开始一个事务
  QString QSqlDatabase::userName() const
  返回连接的用户名
二、QSqlQuery
1、QSqlQuery简介
  QSqlQuery类提供了执行、操作SQL语句的一种手段。QSqlQuery封装了涉及创建、导航和通过连接执行SQL查询语句获取数据的功能。QSqlQuery能用于执行DML语句(如SELECT、INSERT、UPDATE、DELETE)和DDL语句(如CREATE TABLE),也能够用于执行非标准SQL的特定数据库的命令(如PostgreSQL语句:SET DATESTYLE=ISO)。
  执行SQL语句成功会设置QSqlQuery对象的状态为活跃,否则设置为非活跃。无论哪种情况,当执行一条新的SQL语句时,查询都被定位在一条无效的记录上。在数据被获取前,一个活跃的查询必须被导航到一条有效的记录上。
2、QSqlQuery成员函数
  QSqlQuery::QSqlQuery(QSqlResult *result)
  使用result构建一个QSqlQuery对象
  QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
  使用SQL语句query、数据库db构建一个QSqlQuery对象,如果数据库db为指定、非法,使用应用程序默认的数据库
  QSqlQuery::QSqlQuery(QSqlDatabase db)
  QSqlQuery::QSqlQuery(const QSqlQuery &other)
  void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
  当使用位置值绑定时,增加val到值链表中
  int QSqlQuery::at() const
  返回查询的当前内部位置
  void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
  将值val绑定到占位符placeholder
  void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
  QVariant QSqlQuery::boundValue(const QString &placeholder) const
  QVariant QSqlQuery::boundValue(int pos) const
  QMap QSqlQuery::boundValues() const
  void QSqlQuery::clear()
  清除结果集,释放查询占用的任何资源。设置查询状态到非活跃
  const QSqlDriver *QSqlQuery::driver() const
  返回查询关联的数据库的驱动
  bool QSqlQuery::exec(const QString &query)
  执行SQL语句query,查询执行成功时,返回true,设置查询为活跃状态
  在查询执行后,查询定位在一个无效的记录上,在获取数据值前必须把查询移动到有效的记录上。对于SQLite数据库,query字符串每次只能包含一条语句。
  bool QSqlQuery::exec()
  执行一条事先准备的SQL语句
  bool QSqlQuery::execBatch(BatchExecutionMode mode = ValuesAsRows)
  批处理执行事先准备的SQL查询语句
  QString QSqlQuery::executedQuery() const
  返回最后成功执行的查询语句
  bool QSqlQuery::first()
  如果结果集可用,查询的位置在获取记录的查询上,则获取结果集中的第一条记录
  bool QSqlQuery::isActive() const
  如果查询处于活跃状态,返回true
  bool QSqlQuery::isSelect() const
  如果当前查询是一条SELECT语句,返回true
  bool QSqlQuery::isValid() const
  如果查询的当前定位在有效的记录上,返回true
  QSqlError QSqlQuery::lastError() const
  返回查询发生的最后一次错误的错误信息
  bool QSqlQuery::next()
  如果查询可用,并且定位在获取的记录上,获取结果中的下一条记录
  bool QSqlQuery::prepare(const QString &query)
  事先准备要执行的SQL语句
  bool QSqlQuery::previous()
  如果查询可用,并且定位在获取的记录上,则获取结果中的前一条记录
  QSqlRecord QSqlQuery::record() const
  返回当前查询的包含字段信息的一条记录
  QVariant QSqlQuery::value(int index) const
  返回当前记录中index字段的值
  QVariant QSqlQuery::value(const QString &name) const
  返回当前记录中字段名为name的字段的值
3、操作结果集
  使用QSqlQuery对象执行SQL语句查询操作得到的所有记录是一个结果集,QSqlQuery类提供了多个函数来处理得到的结果集。通常结果集中的记录从0开始。

  bool seek(int index, bool>  bool first()query指向结果集的第一条记录
  bool last()query指向结果集的最后一条记录
  bool next()query指向下一条记录,每执行一次函数,便指向相邻的下一条记录
  bool previous()query指向上一条记录,每执行一次函数,便指向相邻的上一条记录
  QSqlRecord record() const获得现在指向的记录
  QVariant value(int index) const获得记录中第n个属性的值
  int at() const获得现在query指向的记录在结果集中的编号
  执行完query.exec("select *from student");代码时,query是指向结果集外的,可以利用query.next()使得query指向结果集的第一条记录。也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。为了节省内存开销,推荐的方法是,在query.exec("select * from student");代码前加上query.setForwardOnly(true);代码,此后只能使用next()和seek()函数。
  query.exec("select * from student");
  query.next();
  QString name = query.value(1).toString();
  qDebug()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-624205-1-1.html 上篇帖子: SQL学习之T-SQL编程之函数 下篇帖子: SQL语句小总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表