基本语法
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(); //获取每条记录中属性(即列)的个数