Qt Sqlite數據庫(sql語句操作)

使用Qt的數據庫之前,首先要在項目文件里加入如圖的sql字段


image.png

通過下列代碼可打印出本機所支持的所有數據庫引擎

//打印Qt支持的數據庫引擎
    qDebug()<<QSqlDatabase::drivers();

我的機器輸出如下,

("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")

添加數據庫

下列代碼添加一個Sqlite數據庫引擎

    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");

設置數據庫

//設置數據庫
    db.setDatabaseName("../info.db");

打開數據庫

如果下列語句能夠正常執行通過而不直接return終止,那么后面能執行的代碼就是打開成功的代碼

//打開數據庫
    if(!db.open()){
        //如果數據庫打開失敗
        QMessageBox::warning(this,"錯誤",db.lastError().text());
        return;
    }

數據庫插入

只要前面的數據庫創建成功,后面直接創建對象

QSqlQuery query;

就可以執行任意sql語句
query.exec(sql語句字符串)

簡單的sql語句講解

以下sql語句均可以直接在SQLiteBrowser可視化瀏覽器中直接執行

創建數據庫表

create table student(id int primary key, name varchar(255), age int, score int);

上述sql語句創建了一張表,
表名為student
其中有id:int數字作為鍵
有字段name:varchar(255)
age:int
score:int
在一個數據表中,每一條數據都擁有一個唯一的主鍵,在創建數據表時,primary key用于標識每一條數據的主鍵,上述創建的數據表中id作為int類型的主鍵

刪除數據庫表

drop table student

上述sql語句將刪除一個數據庫表

插入數據

insert into student (id, name, age) values(1,"mike",18);
insert into student (id, name, age, score) values(2,"lucy",22,90);
insert into student (id, name, age, score) values(3,"Tom",20,78);

上述操作將像student數據表中增加三個數據庫條目,注意第一個參數id為數據庫的主鍵,每條數據的主鍵不能重復,否則數據庫將會報錯重復添加。
執行上述sql語句后,通過SQLiteBrowser可查看出數據庫student表中將存在如下信息,


image.png

更新數據

update student set score = 90 where id =3

更新student數據表中,從id=3的條目中,設置score=90
即修改student表中id=3的數據項的score為90

查找數據

select * from student
image.png

如上代碼,為選中student數據表中所有鍵的數據


select name from student

這條sql語句用于選中student數據表中的所有name鍵的數據

image.png


select score from student where name="Tom"

這條sql語句用于選中student數據表中name="Tom"的score

刪除數據

delete from student where name = "mike"

這條sql語句用于刪除所有student數據表中name=“mike”的表項

插入單條數據

image.png

如下代碼,當Insert按鈕按下,直接執行下列代碼,

    QString id=ui->idBox->text();
    QString name=ui->nameEdit->text();
    QString age=ui->ageBox->text();
    QString score=ui->scoreBox->text();
    QSqlQuery query;

    QString insertSql="insert into student(id,name,age,score) values(%1,'%2',%3,%4)";
    insertSql=insertSql.arg(id,name,age,score);
    query.exec(insertSql);

則可以插入一條數據

批量插入數據

//Windows的ODBC風格操作數據庫
    //創建sql預處理語句?為占位符,后面將根據數據編譯為普通sql語句

    query.prepare("insert into student(id,name,age,score) values(?,?,?,?)");

    //分別創建幾個鍵的列表
    QVariantList idList,nameList,ageList,scoreList;
    idList<<1<<2<<3;
    nameList<<"A"<<"B"<<"C";
    ageList<<11<<22<<33;
    scoreList<<59<<69<<79;

    //按順序綁定相應的值
    query.addBindValue(idList);
    query.addBindValue(nameList);
    query.addBindValue(ageList);
    query.addBindValue(scoreList);

    //執行預處理命令
    query.execBatch();

以上代碼將批量添加三個數據項,如圖


image.png

實際上底層為分別構造并執行了3條sql語句。


 //Oracle風格

    //與odbc風格不同的是,oracle風格的占位為 :+自定義名稱(一般和鍵名稱相同)
    query.prepare("insert into student(id,name,age,score) values(:id,:name,:age,:score)");

    //分別創建幾個鍵的列表
    QVariantList idList,nameList,ageList,scoreList;
    idList<<1<<2<<3;
    nameList<<"A"<<"B"<<"C";
    ageList<<11<<22<<33;
    scoreList<<59<<69<<79;

    //按字段綁定
    query.bindValue(":id",idList);
    query.bindValue(":name",nameList);
    query.bindValue(":age",ageList);
    query.bindValue(":score",scoreList);

    //執行預處理命令
    query.execBatch();
image.png

由上可看出,兩者區別除了占位符不同外,僅在于前者的addBindValue有序,后者的bindValue可以無序

遍歷數據庫

    QSqlQuery query;
    query.exec("select * from student");


    QString result="";
    //遍歷取得的所有結果
    while(query.next()){
        result+=query.value(0).toString()+' ';
        result+=query.value("name").toString()+' ';
        result+=query.value(2).toString()+' ';
        result+=query.value("score").toString()+' ';
        result+='\n';
    }
    QMessageBox::information(this,"查詢結果",result);

如上代碼,指定query.next()則依次從第0條數據項遍歷到最后一項,其中通過query.value(整數)可以按照索引獲取相應鍵的值,同樣也可以直接傳入鍵名獲取對應的值。

查詢數據項

設計界面如圖,


image.png

代碼如下,

QSqlQuery query;
    query.exec(QString("select * from student where %1 = %2")
               .arg(ui->keyBox->currentText(),
                    ui->findValueEdit->text()));


    QString result="";
    //遍歷取得的所有結果
    while(query.next()){
        result+=query.value("id").toString()+' ';
        result+=query.value("name").toString()+' ';
        result+=query.value("age").toString()+' ';
        result+=query.value("score").toString()+' ';
        result+='\n';
    }
    if(result.isEmpty()){
        QMessageBox::warning(this,"查詢結果","找不到結果");
    }else{
        QMessageBox::information(this,"查詢結果",result);
    }

可實現數據庫的查詢。
如數據庫中添加兩個重名的張三,點擊這個查詢數據,將可查詢出所有的張三.


image.png

刪除數據項

只需要將上述查詢數據項的sql語句中的select *替換為delete即可,代碼如下

    QSqlQuery query;
    bool success=query.exec(QString("delete from student where %1 = %2")
               .arg(ui->keyBox->currentText(),
                    ui->findValueEdit->text()));
    if(success){
        QMessageBox::information(this,"刪除成功","刪除成功");
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374