QT简单使用SQLITE3

一、创建数据库

	.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;
            }

你可能感兴趣的:(QT)