1.首先在.pro文件里加入QT += sql,让qt支持MySQL 2.QSqlDatabase类是实现了数据库连接的操作 3.QSqlQuery类执行SQL语句 4.QSqlRecord类封装数据库所有记录
QSqlDatabase类
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI"); db.setHostName("localhost"); //数据库主机名 db.setDatabaseName("scott"); //数据库名 db.setUserName("stott"); //数据库用户名 db.setPassword("tiger"); //数据库密码 db.open(); //打开数据库连接 db.close(); //释放数据库连接示例代码:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName(m_sRemoteIP); db.setPort(m_nRemotePort); db.setDatabaseName(m_sSqlName); db.setUserName(m_sUserName); db.setPassword(m_sPassWord); if (!db.open()) { QMessageBox::information(NULL,"提示","数据库连接失败"); qDebug()<<db.open()<<"Cannot open database!!!"; }**.h
bool connectMySql(); //连接数据库**.cpp
bool 类名::connectMySql() { //创建连接 bool ok = db.open(); if(!ok) { qDebug()<<"connect to mysql fail"; return false; } else { qDebug()<<"connect to mysql OK"; return true; } qDebug()<<db.connectionName(); // QSqlDatabase::removeDatabase("narivdg"); //移除数据库 }**.h
void closeMySql(); //关闭数据库连接**.cpp
void 类名r::closeMySql() { // QSqlDatabase db = QSqlDatabase::database("narivdg"); //获得实例。 // if(db.isOpen()) // { // db.close(); //关闭数据库 // qDebug()<<"Database data exceptionally successful!"; // } // QString name = db.connectionName(); // QSqlDatabase::removeDatabase(name); // QSqlDatabase::removeDatabase(db.connectionName()) QString name; { name = QSqlDatabase::database().connectionName(); if(QSqlDatabase::database().isOpen()) { QSqlDatabase::database().close(); //关闭数据库 qDebug()<<"Database data exceptionally successful!"; } }//超出作用域,隐含对象QSqlDatabase::database()被删除。 //QSqlDatabase::removeDatabase(name); }QSqlQuery类 插入值(sql语句)到数据库操作 两种插入方式: (1)直接用SQL语句插入(参照上面) (2)利用预处理方式插入(ORACLE语法和ODBC语法) 适合插入多条记录,或者避免将值转换成字符串(即正确地转义),调用prepare()函数指定一个包含占位符的query,然后绑定要插入的值
示例代码: (1)的示例代码
if(!connectMySql()) { m_pMutex->unlock(); qDebug()<<"Database data opening failed!"; return; } qDebug()<<"Database data opened successfully!"; //从数据库提取数据信息 QSqlQuery query; //注意这个必须要写在connectMySql()后面,不然有时候会出现问题 QString sql = QString("select ...."); //里面写想要实现功能的MySQL语法 query.exec(sql); //这一句执行后就等同于在数据库里执行了MySQL语句了 while(query.next()) //注意这语句只有在只是select语法时才会执行 { //需要执行的语句(查询数据库操作) QString name = query.value(0).toString(); //取第i条记录第1个字段(从0开始计数)的结果 int age = query.value(1).toInt(); //取第i条记录第2个字段的结果 } //如果执行的不是select语句,那可以用下面的语句进行替代上面的语句 if( query.exec(sql)) { //需要执行的语句 ... } closeMySql(); //关闭数据库(2)的示例代码 ORACLE语法
QSqlQuery query; query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询 query.bindValue(":name", "小王"); //在绑定要插入的值 query.bindValue(":age", 11); query.exec();ODBC语法
QSqlQuery query; query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询 query.addBindValue("小王"); //在绑定要插入的值 query.bindValue(11); query.exec();基本操作语法: seek(int n) :query指向结果集的第n条记录。指定当前的位置 first() :query指向结果集的第一条记录。 last() :query指向结果集的最后一条记录。 next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。 previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。 record() :获得现在指向的记录。 value(int n) :获得属性的值。其中n表示你查询的第n个属性 int rowNum = query.at(); //获取query所指向的记录在结果集中的编号 int fieldNo = query.record().indexOf(“name”); //返回"name"的列号 int columnNum = query.record().count(); //获取每条记录中属性(即列)的个数
