一、创建数据库
.pro文件
QT += sql
.h文件
QSqlDatabase *m_pDatabase;
QSqlQuery *m_pSqlQuery;
.cpp文件
QString dbFileName = qApp->tr("./User/Login.db"); //路径一定要准确,这里使用相对路径(也就是在项目生成的DEBUG目录下)
QFileInfo file(dbFileName); //用于判断文件是否存在
if(!file.exists()){
//创建数据库
m_pDatabase = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE")); //指定数据库类型
m_pDatabase->setDatabaseName(dbFileName);//指定链接名
if (!m_pDatabase->open()){ //打开数据库连接(物理连接)
QMessageBox::critical(NULL, qApp->tr("Cannot open database"),
m_pDatabase->lastError().text());
}
//使用QSqlQuery类操作数据库
m_pSqlQuery = new QSqlQuery(*m_pDatabase);
if(m_pSqlQuery == NULL){
qDebug() << "error" << endl;
}
CreateDatabaseTale(); //创建数据表(为了不重复创建)
}
else{
m_pDatabase = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE"));
m_pDatabase->setDatabaseName(dbFileName);
if (!m_pDatabase->open()){
QMessageBox::critical(NULL, qApp->tr("Cannot open database"),
m_pDatabase->lastError().text());
}
m_pSqlQuery = new QSqlQuery(*m_pDatabase);
if(m_pSqlQuery == NULL){
qDebug() << "error" << endl;
}
}
二、创建表
int CAccountManage::CreateDatabaseTale(){
//准备命令
m_pSqlQuery->prepare("CREATE TABLE UserAccount ( \
UserAccountName VARCHAR(64) NOT NULL PRIMARY KEY,\
UserAccountPassword VARCHAR(64) NOT NULL, \
UserAccountType VARCHAR(64) NOT NULL)");
if(!m_pSqlQuery->exec()){ //执行命令
QMessageBox::critical(NULL, qApp->tr("Cannot creat table"),
m_pSqlQuery->lastError().text());
return -1;
}
return 0;
}
/**
PRIMARY KEY :主键
NOT NULL:不能为空
VARCHAR(64):可变长字符类型
**/
三、增删查改
//添加数据
int CAccountManage::AddAccount(ACCOUNTINFO &tAccount){
QString addSqlText = "INSERT INTO UserAccount (UserAccountName, UserAccountPassword, UserAccountType) \
VALUES (:name, :password, :type)";
m_pSqlQuery->prepare(addSqlText);
m_pSqlQuery->bindValue(":name", tAccount.tName); //绑定值
m_pSqlQuery->bindValue(":password", tAccount.tPassword);
m_pSqlQuery->bindValue(":type", tAccount.nType);
if(!m_pSqlQuery->exec()){
QMessageBox::warning(0, qApp->tr("Add account fail"),
m_pSqlQuery->lastError().text());
return -1;
}
return 0;
}
//删除数据
int CAccountManage::DeleteAccount(QString &tName){
bool bRtn = true;
QString delSqlText;
delSqlText = QString("DELETE FROM UserAccount WHERE UserAccountName = '%1'").arg(tName);
bRtn = m_pSqlQuery->exec(delSqlText);
if(!bRtn){
QMessageBox::warning(0, qApp->tr("Delete account fail"),
m_pSqlQuery->lastError().text());
}
return bRtn;
}
//查找数据
int CAccountManage::CheckUsernameAndPassword(QString &tName, QString &tPassword, QString &nType){
QString name = tName;
QString password = tPassword;
int nRtn = 1; //不存在
m_pSqlQuery->setForwardOnly(true);//节省空间
//查找指定数据
QString selSqlText = QString("SELECT * FROM UserAccount WHERE UserAccountName = '%1'").arg(name);
if(!m_pSqlQuery->exec(selSqlText)){
QMessageBox::warning(0, qApp->tr("Qurey fail"),
m_pSqlQuery->lastError().text());
return -1;
}
while(m_pSqlQuery->next()){
//do something
}
m_pSqlQuery->clear(); //清空查找的结果集
//查找所有
//QString selSqlText = QString("SELECT * FROM UserAccount");
//if(!m_pSqlQuery->exec(selSqlText)){
// QMessageBox::warning(0, qApp->tr("Update fail"),
// m_pSqlQuery->lastError().text());
// return -1;
//}
//while(m_pSqlQuery->next()){
// //do something
//}
//m_pSqlQuery->clear(); //清空查找的结果集
return nRtn;
}
/****/
其中的SQL语句 “SELECT * FROM UserAccount” 中 “*” 号表明查询表中记录的所有属性。而当 m_pSqlQuery->exec(); 这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以称之为结果集。
结果集其实就是查询到的所有记录的集合,在 QSqlQuery 类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的操作有:
• seek(int n) : query 指向结果集的第n条记录;
• first() : query 指向结果集的第一条记录;
• last() : query 指向结果集的最后一条记录;
• next() : query 指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;
• previous() : query 指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;
• record() :获得现在指向的记录;
• value(int n) :获得属性的值。其中 n 表示你查询的第n个属性,比方我们使用 “SELECT * FROM UserAccount ”,那么 value(0) 返回 UserAccountName 属性的值, value(1) 返回 UserAccountPassword属性的值。该函数返回 QVariant 类型的数据,可通过如m_pSqlQuery->value(0).toString()语句得到所需类型值。
• at() :获得现在 query 指向的记录在结果集中的编号。
需要特别注意,刚执行完 m_pSqlQuery->exec(); 这行代码时, m_pSqlQuery是指向结果集以外的,我们可以利用 m_pSqlQuery.next() 使得 m_pSqlQuery指向结果集的第一条记录。当然我们也可以利用 seek(0) 函数或者 first() 函数使 m_pSqlQuery指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是, 这行代码前加上 m_pSqlQuery->setForwardOnly(true); 这条代码,此后只能使用 next() 和 seek() 函数。
/****/
//修改数据
QString updSqlText = QString("UPDATE UserAccount SET User_Account_Password = '%1' WHERE User_Account_Name='%2'").arg(tNewPassword).arg(tName);
if(!m_pSqlQuery->exec(updSqlText)){
QMessageBox::warning(0, qApp->tr("Update fail"),
m_pSqlQuery->lastError().text());
return -1;
}
来源:CSDN
作者:HUANG_XIAOJUN
链接:https://blog.csdn.net/HUANG_XIAOJUN/article/details/103586577