Qt代码学习-数据库模块问题

QT代码学习-MySQL数据库问题

	知识回顾:
			1.[static]void QSqlDatabase::removeDatabase(const QString &connectionName) 
			   从数据库连接列表中删除数据库连接connectionName。
			   警告:当这个函数被调用时,数据库连接上应该没有打开的查询,否则会导致资源泄漏。
		
			2.[static]QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true)
			返回名为connectionName的数据库连接。数据库连接必须是之前用addDatabase()添加的。如果open为true(缺省值),并且数据库连接还没有	打开,那么现在就打开它。如果没有指定connectionName,则使用默认连接。如果connectionName在数据库列表中不存在,则返回无效连接。
3.QT手册内容
错误示例:

QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
QSqlDatabase::removeDatabase("sales"); // will output a warning

// "db" is now a dangling invalid database connection,
// "query" contains an invalid result set

正确写法:
{
    QSqlDatabase db = QSqlDatabase::database("sales");
    QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct
	**个人理解:**
	在创建数据库连接之前,为避免出现未知错误,最好删除原数据库中默认连接。
	在删除时,必须在removeDatabase函数前使用局部作用限定静态函数database(),这样使得:
	超出作用域,database()调用析构函数,撤销掉database()额外构造出的隐含对象,否则隐含对象“db”是一个悬空的无效数据库连接,导致警告。
    **代码示例:**
bool createConnection()
{
    /* 删除默认链接 */
    QString name;
    {
        name = QSqlDatabase::database().connectionName();//QSqlDatabase::database()   QSqlDatabase::connectionName()
    }
    QSqlDatabase::removeDatabase(name);

    /* 创建数据库连接对象1,指出连接使用的数据库驱动类型,不指定连接名(默认连接)*/
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
    db.setConnectOptions("MYSQL_OPT_RECONNECT=1");  //长时间无操作(默认8小时)数据库会断开,设置断开后可自动重连
    
    BaseOperation baseOperation;
    QString DataBaseIP          = baseOperation.ReadParamsFromINIFile("DataBase/DataBaseIP","127.0.0.1");
    QString DataBaseName        = baseOperation.ReadParamsFromINIFile("DataBase/DataBaseName","monitor");
    QString DataBaseUserName    = baseOperation.ReadParamsFromINIFile("DataBase/UserName","root");
    QString DataBaseUserPass    = baseOperation.ReadParamsFromINIFile("DataBase/UserPass","root");
    
    db.setHostName(DataBaseIP);         //设置连接主机名
    db.setPort(3306);                   //设置连接端口号
    db.setDatabaseName(DataBaseName);   //设置连接的数据库名
    db.setUserName(DataBaseUserName);   //设置用户名
    db.setPassword(DataBaseUserPass);   //设置密码
    bool ok = db.open();                //打开数据库连接
    if(!ok){
        QMessageBox::critical(0, "提示",QString(" 连接数据库失败!!! "));
        return false;
    }
    else{
         //QMessageBox::about(0, "提示",QString(" 连接数据库成功!!! "));
    }
    try
    {
	#ifdef Q_OS_UNIX
        db.exec("SET NAMES 'utf-8'");
	#else                                   //在数据库上执行一条SQL语句并返回一个QSqlQuery对象。
                                        //使用lastError()检索错误信息。如果查询为空,则返回一个空的无效查询,并且lastError()不受影响。
         db.exec("SET NAMES 'utf-8'");
	#endif                  //条件编译  如果标识符Q_OS_UNIX已被#define命令定义过则,否则
    }
    catch(QString exception)
    {
        QMessageBox::critical(0, "提示",exception);
    }

    /* 创建数据库连接对象2,需要使用不同的连接名,这里是 ReceiveConnect*/
    QSqlDatabase db2 = QSqlDatabase::addDatabase("QMYSQL","ReceiveConnect");
    db2.setConnectOptions("MYSQL_OPT_RECONNECT=1");
    db2.setHostName(DataBaseIP);
    db2.setPort(3306);
    db2.setDatabaseName(DataBaseName);
    db2.setUserName(DataBaseUserName);
    db2.setPassword(DataBaseUserPass);
    ok = db2.open();
	#ifdef Q_OS_UNIX
	        db2.exec("SET NAMES 'utf-8'");
	#else
        db2.exec("SET NAMES 'utf-8'");
	#endif
	}
代码中第二个注意点:
	多个连接在创建时,注意要使用不同的连接名,文中一个为默认,一个为REceiceConnect。
	 db2.setConnectOptions("MYSQL_OPT_RECONNECT=1"); 本语句中的参数为 设置数据库选项,本文中的设置是MySQL中超时设置
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值