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中超时设置