• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            zhonghua

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

             #include <QtSql>
            QT += sql
            QSqlDatabase類實現(xiàn)了數(shù)據(jù)庫連接的操作
            QSqlQuery類執(zhí)行SQL語句
            QSqlRecord類封裝數(shù)據(jù)庫所有記錄

            QSqlDatabase類

            1. QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");  
            2. db.setHostName("localhost");    //數(shù)據(jù)庫主機名   
            3. db.setDatabaseName("scott");    //數(shù)據(jù)庫名   
            4. db.setUserName("stott");        //數(shù)據(jù)庫用戶名   
            5. db.setPassword("tiger");        //數(shù)據(jù)庫密碼   
            6. db.open();          //打開數(shù)據(jù)庫連接  
            7. db.close();         //釋放數(shù)據(jù)庫連接  

            建立數(shù)據(jù)庫文件

            1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
            2. db.setDatabaseName("database.db");  
            3. if (!db.open())   
            4. {  
            5.     qDebug("數(shù)據(jù)庫不能打開");  
            6. }  
            7. return false;  
            1. 建立數(shù)據(jù)庫文件后創(chuàng)建表并插入兩條數(shù)據(jù)  
            1. QSqlQuery query;  
            2. query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,  
            3.             name nvarchar(20), age int)"); //id自動增加  
            4. query.exec("insert into student values(1,'小明', 14)");  
            5. query.exec("insert into student values(2,'小王',15)");  


            QSqlQuery類

            插入值到數(shù)據(jù)庫操作

            一、直接用SQL語句插入(參照上面)

            二、利用預處理方式插入(ORACLE語法和ODBC語法)

            適合插入多條記錄,或者避免將值轉(zhuǎn)換成字符串(即正確地轉(zhuǎn)義),調(diào)用prepare()函數(shù)指定一個包含占位符的query,然后綁定要插入的值

            ORACLE語法

            1. QSqlQuery query;   
            2. query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //準備執(zhí)行SQL查詢  
            3. query.bindValue(":name", "小王");   //在綁定要插入的值  
            4. query.bindValue(":age", 11);   
            5. query.exec();  


            ODBC語法

            1. QSqlQuery query;  
            2. query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //準備執(zhí)行SQL查詢  
            3. query.addBindValue("小王");   //在綁定要插入的值  
            4. query.bindValue(11);  
            5. query.exec();  

            三、批量插入到數(shù)據(jù)庫中

            1. QSqlQuery query;  
            2. query.prepare(“insert into student values (?, ?)”);  
            3. QVariantList names;  
            4. names << "小王" << "小明" << "小張" << "小新"; // 如果要提交空串,用QVariant(QVariant::String)代替名字  
            5. query.addBindValue(names);  
            6. QVariantList ages;  
            7. ages << 11 << 13 << 12 << 11;  
            8. query.addBindValue(ages);  
            9. if (!q.execBatch()) //進行批處理,如果出錯就輸出錯誤  
            10.     qDebug() << q.lastError();  


            查詢數(shù)據(jù)庫操作

            1. QSqlQuery query;  
            2. query.exec("SELECT * FROM t_STUDENT"); // 查詢的結(jié)果可能不止一條記錄,所以我們稱之為結(jié)果集  
            3. while (query.next())  
            4. {  
            5.     QString name = query.value(0).toString(); //取第i條記錄第1個字段(從0開始計數(shù))的結(jié)果  
            6.     int age = query.value(0).toInt(); //取第i條記錄第2個字段的結(jié)果  
            7.     // ... 處理name,age變量數(shù)據(jù)   
            8. }  


            seek(int n) :query指向結(jié)果集的第n條記錄。指定當前的位置

            first() :query指向結(jié)果集的第一條記錄。

            last() :query指向結(jié)果集的最后一條記錄。

            next() :query指向下一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的下一條記錄。

            previous() :query指向上一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的上一條記錄。

            record() :獲得現(xiàn)在指向的記錄。

            value(int n) :獲得屬性的值。其中n表示你查詢的第n個屬性

            int rowNum = query.at(); //獲取query所指向的記錄在結(jié)果集中的編號

            int fieldNo = query.record().indexOf(“name”); //返回"name"的列號

            int columnNum = query.record().count(); //獲取每條記錄中屬性(即列)的個數(shù)

             

            事務操作

            操作函數(shù):transaction(),commit()提交,rollback()回滾
            操作事務前,先判斷該數(shù)據(jù)庫是否支持事務操作。hasFeature是QSQLDriver類函數(shù)

            1. if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //   

             插入一條記錄,然后提交事務

            1. QSqlDatabase::database().transaction();  
            2. QSqlQuery query;  
            3. query.exec("SELECT id FROM T_STUDENT WHERE class=1");  
            4. if (query.next())  
            5. {  
            6.     query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");  
            7. }  
            8. QSqlDatabase::database().commit();  
            posted on 2012-04-23 11:16 米米 閱讀(619) 評論(0)  編輯 收藏 引用 所屬分類: qt
            久久精品国产清自在天天线| 狠狠色丁香久久婷婷综合| 日韩美女18网站久久精品| 国产精品岛国久久久久| 囯产极品美女高潮无套久久久| 色悠久久久久久久综合网| 久久免费视频网站| 久久婷婷久久一区二区三区| 精品国际久久久久999波多野| 亚洲精品乱码久久久久久蜜桃不卡 | 久久成人精品| 久久精品无码一区二区app| 久久国产视频99电影| 国产精品成人久久久久久久| 国产L精品国产亚洲区久久| 中文精品久久久久国产网址| 国产成人久久精品麻豆一区| 精品久久国产一区二区三区香蕉 | 66精品综合久久久久久久| 久久99国产综合精品| 狠狠色婷婷综合天天久久丁香 | 久久无码中文字幕东京热| 一本久道久久综合狠狠躁AV| 久久91精品国产91久| 亚洲AV无码一区东京热久久| 久久99国内精品自在现线| 91麻豆精品国产91久久久久久| 久久精品中文字幕第23页| 久久综合九色综合欧美就去吻| 亚洲精品99久久久久中文字幕 | 久久精品中文字幕第23页| 少妇人妻综合久久中文字幕| 狠狠色婷婷久久一区二区三区| 久久99国产精品一区二区| 合区精品久久久中文字幕一区 | 国产精品熟女福利久久AV| 少妇久久久久久被弄到高潮 | 欧美伊人久久大香线蕉综合69 | 久久精品人人槡人妻人人玩AV| 狠狠狠色丁香婷婷综合久久五月 | 亚洲国产精品久久久久婷婷老年|