SQLite实现用户登录功能

huatechinfo
发布于 2021-1-7 14:43
浏览
0收藏

SQLite实现用户登录功能

void login::on_LoginToMain_clicked()
{
//登录按钮,需要判断用户名和密码是否正确对应
//如果错误弹出提示对话框

//--------------------------------------
//使用SQlite比对用户名和密码
QSqlDatabase db;//使用QSlite驱动
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
    db = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
    db = QSqlDatabase::addDatabase("QSQLITE");
}
db.setDatabaseName("D:\\QtApplication\\library1-0\\db\\userdata.db");//之前建立的数据库
bool flag=db.open();//判断是否打开
if(flag)
{
    QSqlQuery query;//新建查询实例
    //如果数据库打开成功,就创建一个关联的QSqlQuery对象,最后由QSqlQuery来执行插入数据工作。
    //特别注意:QSqlQuery对象的创建必须在db文件open成功以后才行,否则会出错。
    if(query.exec("select * from member"))
    {
        //此处为访问所有的数据
        qDebug()<<"读取成功";
        //定义登陆界面的两个文本框输入的内容
        int uname=ui->userName->text().toInt();
        QString password=ui->password->text();
        qDebug()<<"create success";
        if(ui->userName->text()==NULL&&ui->password->text()==NULL)
        {
            //如果输入为空
            QMessageBox::warning(this,QString(tr("Waring")),
                                     QString(tr("输入不能为空!请重新输入!")));
        }
        else
        {
            //输入不为空时
            int nameno=0;//用来seek处定位行数,索引
            while(query.next())//循环进行查找
            {
                qDebug()<<"searchsuccess";
                if(uname==query.value(1).toInt())//此处value(1)是存着学号的列
                {
                    //value(int n) :获得属性的值。其中n表示你查询的第n个属性,
                    //比方我们使用“select * from student”就相当于
                    //“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值
                    nameno=query.value(0).toInt();//此处value(0)是存着序号的列
                }
                else
                {
                    qDebug()<<"none";
                }
            }
            if(query.seek(nameno))
            {
                //seek(int n) :query指向结果集的第n条记录。定位到刚刚找到的用户名(学号)对应的行,查找密码进行对比
                qDebug()<<"select success";
                QString spassword=query.value(2).toString();//读出此行存储的密码
                qDebug()<<uname<<spassword;
                if(spassword==password)
                {
                    //如果密码匹配,跳转进入主界面
                    QMessageBox::information(NULL,QString(tr(" ")),
                                                 QString(tr("登录成功")));
                    qDebug()<<"login success";
                    accept();
                }
                else
                {//用户名和密码不对应
                    QMessageBox::warning(this,QString(tr("Waring")),
                                             QString(tr("用户名或密码错误!请重新输入!")));
                    ui->userName->clear();//自动清除用户名和密码
                    ui->password->clear();
                    ui->userName->setFocus();//定位光标
                 }
            }
        }
    }
}}

此处注意,最初查询时不要用

query.prepare("select * from member");

具体原因待续,prepare和exec具体功能不同!o_O

  • prepare()

这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句
还需要后续执行step,finalize语句。

  • exec()
    sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err)
    db描述的是数据库句柄;
    [sql UTF8String]要执行的SQL语句;如“select * from member”
    第三个参数为回调函数;
    第四void *回调函数的第一个参数;
    err&错误信息,如果没有SQL问题则值为NULL

使用exec()查询,不然无法查询,member就是表的名字,可以在可视化工具navicat中查看。

收藏
回复
举报
回复
    相关推荐